2013-02-10 12 views
11

K & R Second Editionの(71ページ) - 私は説明を見逃している必要があります。疑問符演算子

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

これの文脈が二重に文字列を変換する関数です。この部分は、特に、関数が空白をスキップした後に発生します。 私は推論よりも優れてやりたいreturn sign * val /power;

...それはが正または負の値をチェックし、関数の最後で符号変換のいずれかとして-1または+1、それを保存している推測。 ..私は特に?: 1がここで何をしているのか、それとも何処にいるのかは分かりません。

これは抽象的なifのようなものです。 ?は真実をチェックし、:elseです...そうですか?それはif/elseに限定されていますか?

私は初心者です。以前はこの式の構文に遭遇していませんでした。なぜなら、それはしばしば形式的なものに置き換えられるような特別な理由があるのだろうかと疑問に思っています。if/else -

答えて

12

に相当します。

これは正しいです。これは、「三項条件演算子」と呼ばれます。

の通常if作品は、条件演算子が表現上で動作しています。


/他の場合には、多くの場合、正式に置き換えているように見える特定の理由がある場合、私は疑問に思って - のほか、おそらく、読みやすさを?

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

const int foo = bar ? 5 : 3; 

これは、通常のif/elseを使用して書き込むことができませんでした。

例えば

は、初期化を検討してください。


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

+0

答えた理由は、理由だけでなく何を対処したからですか。 – d0rmLife

2

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

int sign; 

if(s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
+0

"三項演算子"が完全に正しくない場合、その固有名は "条件演算子"です。 –

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

はの省略形です:

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
1

?:はあなたにC.

条件演算子ですたとえば、if文と同じ結果が得られます。

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
12

それは一種のようです... ?真実をチェックし、:は他にあるかの抽象文のように思えますか?

ええ、ほとんど。これは「条件付き演算子」と呼ばれています(Cの唯一の3項演算子であるため、完全に「3項演算子」と呼ばれることもあります)。 の文ではなく、の式という値があります。最初の引数がtrueと評価された場合は2番目の引数、falseの場合は3番目の引数に評価されます。したがって

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

は、それは一種のif文抽象のように思える

if (s[i] == '-') { 
    sign = -1; 
} else { 
    sign = 1; 
} 
+0

+1の有用性。この答えは実際に "条件演算子"がどのように解釈されるかを説明しています。ありがとう。 – d0rmLife