0
の出力結果にはcoutを使用しているとき、私はこのint c= 0xF^0xF; cout << c;
コンパイルエラービット演算子
しかしcout << 0xF^0xF;
コンパイルしませんを行うことができます。どうして? C++ Operator Precedenceによれば
の出力結果にはcoutを使用しているとき、私はこのint c= 0xF^0xF; cout << c;
コンパイルエラービット演算子
しかしcout << 0xF^0xF;
コンパイルしませんを行うことができます。どうして? C++ Operator Precedenceによれば
、operator<<
はoperator^
より高い優先順位を有するので、cout << 0xF^0xF;
はと等価である:
(cout << 0xF)^0xF;
cout << 0xF
戻りcout
(すなわちstd::ostream
)operator^
のオペランドとして使用することができません。
あなたは正しい優先度を指定するには、括弧を追加することができます。
cout << (0xF^0xF);
おかげでsongyuanyao。好奇心の理由から、 '' << "はビット演算子よりも高い優先順位を持っていますが、" + "のような算術演算子ではないのはなぜですか?例えば、' 'cout << 2 + 3; – Bist
@Bist聖なる基準はそう言いますから。 :)とにかく 'cout << 2 + 3;でも期待通りに動作しますが、カッコを使うべきです。それはあなたの意図をより明確にし、微妙なバグを避けることができます。 Let's all(コード・リーダーとコード・ライター)が無意味な推測を止めましょう。 – songyuanyao
@Bistビット演算子 '^ | & '値算術演算子' + - */<< >>より優先度が低くなります。もともと '<<'は左シフト演算子であり、乗算と同様のカテゴリーであった。だから、 '1 << 3 | 1 << 2」または「1 << 3^1 << 2」となる。次に '<< 'がストリーム抽出演算子として選択されたとき、優先順位は変更されませんでした。これはそれがさらに混乱するためです。 –