Seltsame Ausgabe beim Summieren von 1 << 2 und 1 << 3 in C ++

8

Also habe ich nur ein bisschen Manipulation in C ++ versucht. Folgendes habe ich versucht:

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

Dies ergibt die Ausgabe als 4.

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

Dies ergibt die Ausgabe als 8

Aber wenn ich es mache:

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

Es gibt die Ausgabe als 64. Warum so?

Ich habe auch versucht:

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

Welches gibt die Ausgabe 12wie erwartet.

Ron Howard
quelle
4
<<hat eine niedrigere Priorität als +, 1<<2 + 1<<3=1<<(2 + 1)<<3
LF
Es ist, weil 1<<2 + 1<<3es wirklich ist 1<< 2+1 <<3. Lassen Sie sich nicht von Leerzeichen irreführen.
Pete Becker
Verwenden Sie in solchen Fällen in der Regel Klammern. Sie sind möglicherweise nicht immer erforderlich, verbessern jedoch die Lesbarkeit und verringern das Risiko solcher Fehler. Darüber hinaus müssen Sie nicht jeden Fall von Operator-Vorrang auswendig lernen.
RHertel

Antworten:

7

Dies liegt daran, dass die Addition eine höhere Operatorpriorität als die Bitverschiebung hat. Mit anderen Worten, Ihr zweites Beispiel entspricht1 << (2 + 1) << 3

Da Bitshifting linksassoziativ ist, ist es außerdem dasselbe wie (1 << (2 + 1)) << 3. Dies vereinfacht sich 8 << 3, was ist 64.

Drew McGowen
quelle
6

Es geht um die Priorität des Operators

+Daher hat eine höhere Priorität als Shift - Operatoren, 1<<2 + 1<<3erfolgte wie 1 << (2 + 1) << 3die ähnlich 1 << 6 == 64(da <<ist linksassoziativ , wie Sie oben in der Tabelle Vorrang in dem Link zu sehen)

Das ist auch der Grund cout<<a + b;, warum es funktioniert, weil es als analysiert cout<<(a + b);wird. Andernfalls werden einige Fehler angezeigt, z. B. "Kann einem Stream keine Nummer hinzufügen".

phuclv
quelle
3

Der +Operator hat eine höhere Priorität als der <<Operator. Daher wird diese Zeile hier ausgewertet:

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

Sie sollten es so in Klammern gruppieren:

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