2012-03-08 7 views
7

試してみると、条件演算子の前後に角カッコを入れる必要があることがわかりました。ここで小さな例:条件演算子がcout文で使用されている

#include <iostream> 

int main() { 
    int a = 5; 
    float b = (a!=0) ? 42.0f : -42.0f; 
    // works fine 
    std::cout << b << std::endl; 
    // works also fine 
    std::cout << ((a != 0) ? 42.0f : -42.0f) << std::endl; 
    // does not work fine 
    std::cout << (a != 0) ? 42.0f : -42.0f; 

    return 0; 
} 

出力は次のとおりです。

42 
42 
1 

なぜ、このブラケットが必要なのか?条件付き演算子の結果の型はどちらの場合にも知られていますか?

答えて

13

?:演算子は<<演算子よりも優先順位が低くなります。すなわち、コンパイラはあなたの最後の文を解釈として:最初(a!=0)のブール値をcoutにストリーミングする

(std::cout << (a != 0)) ? 42.0f : -42.0f; 

。その式の結果(すなわち、coutへの参照)は、?:演算子(すなわち、void*http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/参照)で使用するための適切な型にキャストされ、その値が真であるかどうかエラーフラグは設定されません)、値42または値-42のいずれかを取得します。最後に、それはその価値を捨て去ります(何も使用しないので)。

+0

ただ、 'cout <<'は 'cout'を返します。有効な状態に関するものではありません。 failbit/badbitが設定されますが、 '(std :: cout <<(a!= 0))'は常に 'std :: cout'への参照を返します。 '-42.0f'は返されるべきではありません。そのリファレンスは常に真でなければなりません。 –

+0

ありがとう、先例についても考えなかった – m47h

+1

@SamDeHaan:はい。申し訳ありませんが、私はおそらく私の説明では少しばかりではなかったでしょう。式 "cout << x"はcoutを返します。しかし、 "cout?a:b"という式を評価するためには、まず、coutを?:演算子の有効なオペランドである値にキャストする必要があります。この場合、作業を行うのは(operator void *)です。エラーフラグが設定されている場合、その演算子はNULLを返します。参照:

4

<<?よりも高い優先度を持つためです。

楽しいエクササイズ:

float ftest = std::cout << (a != 0) ? 42.0f : -42.0f; 

はコーディングホラー、それを取ります!

あなたのコードは同等です:

if (std::cout << (a != 0)) 
    42.0f; 
else 
    -42.0f; 

それは1出力し、理由も、(a != 0) == true