int a = 1, b = 2;
int c = a*b + b==0; // c = 0
cout << a*b + b==0; // outputs 4
c
は0
に評価します。出力ストリームにおけるC++演算子の優先順位
なぜ同じ式をcout
ステートメント出力4に入れていますか?
int a = 1, b = 2;
int c = a*b + b==0; // c = 0
cout << a*b + b==0; // outputs 4
c
は0
に評価します。出力ストリームにおけるC++演算子の優先順位
なぜ同じ式をcout
ステートメント出力4に入れていますか?
これらの演算子のprecedenceは>operator==
operator*
>operator+
>operator<<
あるため。 cout << a*b + b==0;
は(cout << ((a*b) + b)) == 0;
に相当します。
そして((a*b) + b))
の結果、即ち4
は次に(cout << ((a*b) + b))
の戻り値、すなわちcout
を0
と比較され、プリントアウトされるであろう。 C++ 11 cout
が暗黙的にvoid*
にoperator void*経由で変換される前に、steramにエラーがあった場合にはnullポインタを返します。だからここでは0
(つまりヌルポインタ)と比較して、それ以上のことはしません。
answr by @songyuanyaoはすでにコードの動作を説明しています。
私は、簡単に実行できるコードを書く方がはるかに良いと言ってOPに応答したいと思います。
式の論理がはっきりとわからない場合は、簡略化してください。括弧を使用すると、理解しやすくなります。あなたが難読化されたコードコンテスト用のコードを書いている場合を除き、そのようなコードを書く理由はありません。
はあなたの意図に応じて、
int c = (a*b) + (b==0);
または
int c = ((a*b + b) == 0);
ににそれらのライン
int c = a*b + b==0; // c = 0
を変換します。
<<は、==よりも*高い*優先順位を持ちます。 –
C++に関する良い本やドキュメントには、優先順位を持つ演算子リストが含まれています... –