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.


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.


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".


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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.