15

K&R Second Edition (page 71) -- 説明を見逃していたに違いない:

sign = (s[i] == '-') ? -1 : 1;

これのコンテキストは、文字列を double に変換する関数です。特にこの部分は、関数が空白をスキップした後に来ます。正または負の値をチェックし、関数の最後に符号変換のために-1または+1として保存していると推測します...return sign * val /power;

私は推測するよりもうまくやりたいと思っています...私は と がここで(またはどこかで)何をしているのか特に確信が持て?ませ: 1ん。

抽象的な表現のように思えifます。どこ?が真偽を確かめて:・・・elseそうですか?限定if/elseですか?

私は初心者で、これまでこの式の構文に出くわしたことがないので、正式なif/else--besides, おそらく、読みやすさに置き換えられることが多いように見える特定の理由があるかどうか疑問に思っています?

4

5 に答える 5

19

if ステートメントのようなもので、どこ?が真であるかをチェックし、それ以外の場合:...そうですか?

ええ、ほとんど。これは「条件演算子」と呼ばれます (C で唯一の三項演算子であるため、正確には「三項演算子」と呼ばれない場合もあります)。これはステートメントではありませんが、式であり、値があります。最初の引数が true と評価された場合は 2 番目の引数に評価され、false の場合は 3 番目の引数に評価されます。したがって

sign = (s[i] == '-') ? -1 : 1;

と同等です

if (s[i] == '-') {
    sign = -1;
} else {
    sign = 1;
}
于 2013-02-10T21:59:11.650 に答える
18

抽象的なifステートメントのように思えます。

そのとおりです。これを「三項条件演算子」と呼びます。

通常ifステートメントで機能しますが、条件演算子はで機能します。


おそらく読みやすさ以外に、正式な if/else に置き換えられることが多いように見える特定の理由があるかどうか疑問に思っています。

ステートメントの分岐では不十分な場合があり、式レベルで作業する必要があります。

たとえば、初期化を考えてみましょう:

const int foo = bar ? 5 : 3;

ifこれは、通常の/では書き込めませんでしたelse


ifとにかく、それが/に等しいと言っている人々はelse不正確です。生成されたアセンブリは通常同じですが、同等ではなく、 の簡略版と見なすべきではありませんif。簡単に言えば、if可能な限り条件演算子を使用し、式で分岐する必要がある場合にのみ条件演算子を使用してください。

于 2013-02-10T22:02:53.543 に答える
3

これが三項演算子です。場合とそうでない場合を(s[i] == '-') ? -1 : 1;返します。次に、この値が に割り当てられます。言い換えれば、これをより長く書く方法は次のようになります。-1s[i] == '-'1sign

int sign;

if(s[i] == '-')
{
  sign = -1;
}
else
{
  sign = 1;
}
于 2013-02-10T21:57:31.933 に答える
2

?:Cの条件演算子です。

ifあなたの例では、次のステートメントと同じ結果が生成されます。

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}
于 2013-02-10T21:57:48.247 に答える
0
sign = (s[i] == '-') ? -1 : 1;

は次の省略形です。

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}
于 2013-02-10T21:57:47.773 に答える