Salida extraña al sumar 1 << 2 y 1 << 3 en C ++

8

Así que solo estaba tratando de manipular un poco en C ++. Esto es lo que probé:

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

Esto da la salida como 4.

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

Esto da la salida como 8

Pero cuando lo hago:

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

Da la salida como 64. ¿Porque?

También probé:

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

Lo que da la salida 12como se esperaba.

Ron Howard
fuente
44
<<tiene menor prioridad que +, 1<<2 + 1<<3=1<<(2 + 1)<<3
LF
Es porque 1<<2 + 1<<3es realmente 1<< 2+1 <<3. No se deje engañar por los espacios en blanco.
Pete Becker
Como regla general, use corchetes en tales casos. Puede que no siempre sean necesarios, pero aumentan la legibilidad y reducen el riesgo de tales errores. Además, no necesitará aprender todos los casos de precedencia de operadores de memoria.
RHertel

Respuestas:

7

Esto se debe a que la suma tiene una mayor prioridad de operador que el desplazamiento de bits. En otras palabras, su segundo ejemplo es equivalente a1 << (2 + 1) << 3

Además, dado que el desplazamiento de bits es asociativo a la izquierda, es lo mismo que (1 << (2 + 1)) << 3. Esto se simplifica a 8 << 3, que es 64.

Drew McGowen
fuente
6

Se trata de la precedencia del operador

+tiene mayor precedencia que los operadores de turno, por 1<<2 + 1<<3lo tanto, se realiza de 1 << (2 + 1) << 3forma similar a 1 << 6 == 64(dado que <<es asociativo a la izquierda , como puede ver en la tabla de precedencia en el enlace de arriba)

Por eso también cout<<a + b;funciona, porque se analiza como cout<<(a + b);, de lo contrario, obtendrá algunos errores como "no se puede agregar un número a una transmisión"

phuclv
fuente
3

El +operador tiene una precedencia más alta que el <<operador, así que aquí se está evaluando esa línea:

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

Debe agruparlo así entre paréntesis:

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