Saída estranha ao somar 1 << 2 e 1 << 3 em C ++

8

Então, eu estava apenas tentando um pouco de manipulação em C ++. Aqui está o que eu tentei:

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

Isso fornece a saída como 4.

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

Isso fornece a saída como 8

Mas quando eu faço:

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

Dá a saída como 64. Por quê então?

Eu também tentei:

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

O que fornece a saída conforme 12o esperado.

Ron Howard
fonte
4
<<tem precedência mais baixa do que +, 1<<2 + 1<<3=1<<(2 + 1)<<3
LF
É porque 1<<2 + 1<<3é realmente 1<< 2+1 <<3. Não se deixe enganar pelo espaço em branco.
Pete Becker
Como regra geral, use colchetes nesses casos. Eles podem nem sempre ser necessários, mas aumentam a legibilidade e reduzem o risco de tais erros. Além disso, você não precisará aprender todos os casos de precedência do operador de cor.
RHertel 18/10/19

Respostas:

7

Isso ocorre porque a adição tem uma precedência maior do operador do que o deslocamento de bits. Em outras palavras, seu segundo exemplo é equivalente a1 << (2 + 1) << 3

Além disso, como o deslocamento de bits é associativo à esquerda, é o mesmo que (1 << (2 + 1)) << 3. Isso simplifica para 8 << 3, o que é 64.

Drew McGowen
fonte
6

É sobre a precedência do operador

+tem precedência mais alta que os operadores de turno, portanto, 1<<2 + 1<<3é feito como 1 << (2 + 1) << 3é semelhante a 1 << 6 == 64(já que <<é associativo à esquerda , como você pode ver na tabela de precedência no link acima)

É também por isso que cout<<a + b;funciona, porque é analisado como cout<<(a + b);, caso contrário, você receberá alguns erros como "não é possível adicionar um número a um fluxo"

phuclv
fonte
3

O +operador tem uma precedência mais alta que o <<operador, então aqui está essa linha que está sendo avaliada:

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

Você deve agrupá-lo dessa maneira com parênteses:

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