C ++で1 << 2と1 << 3を合計したときの奇妙な出力


8

したがって、私はC ++で少し操作を試みただけです。これが私が試したものです:

int a = 1<<2;
cout<<a;

これは出力をとして与えます4

int a = 1<<3;
cout<<a;

これは出力を次のように与えます 8

しかし、私がするとき:

int a = 1<<2 + 1<<3;
cout<<a;

それはとして出力を与えます64。なんでそうなの?

私も試しました:

int a = 1<<2;
int b = 1<<3;
cout<<a + b;

12期待どおりに出力が得られます。


4
<<の優先順位は+1<<2 + 1<<3=1<<(2 + 1)<<3
LFの

それ1<<2 + 1<<3は本当に1<< 2+1 <<3ですからです。空白に惑わされないでください。
ピートベッカー

原則として、そのような場合は括弧を使用します。常に必要なわけではありませんが、読みやすさが向上し、そのようなエラーのリスクが軽減されます。さらに、演算子の優先順位のすべてのケースを暗記する必要はありません。
RHertel

回答:


7

これは、加算の方がビットシフトよりも演算子の優先順位が高いためです。つまり、2番目の例は次と同等です。1 << (2 + 1) << 3

さらに、ビットシフトは左結合なので、と同じ(1 << (2 + 1)) << 3です。これはに簡素化8 << 3されています、64


6

演算子の優先順位についてです

+シフト演算子よりも優先順位が高いため、と同様に1<<2 + 1<<3行われます(上記のリンクの優先順位表で確認できるように、が左結合であるため)1 << (2 + 1) << 31 << 6 == 64<<

これも機能する理由です。それはcout<<a + b;として解析されるためcout<<(a + b);です。そうでない場合、「ストリームに数値を追加できません」などのエラーが発生します。


3

+オペレータは、より高い優先順位がある<<ので、ここでは、オペレータのラインが評価されていることです。

int a = (1<<(2 + 1))<<3;

括弧でこのようにグループ化する必要があります:

int a = (1<<2) + (1<<3);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.