在 C++ 中对 1<<2 和 1<<3 求和时出现奇怪的输出

Weird output when summing 1<<2 and 1<<3 in C++

所以我只是尝试在 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

这是因为加法的运算符优先级高于位移位。换句话说,你的第二个例子相当于 1 << (2 + 1) << 3

此外,由于位移是左结合的,因此与(1 << (2 + 1)) << 3相同。这简化为 8 << 3,即 64.

大约operator precedence

+ 比移位运算符具有更高的优先级,因此 1<<2 + 1<<31 << (2 + 1) << 3 类似 1 << 6 == 64(因为 <<left-associative,上面link中的优先级table可以看到)

这也是 cout<<a + b; 起作用的原因,因为它被解析为 cout<<(a + b);,否则你会得到一些错误,例如 "can't add a number to a stream"

+ 运算符的优先级高于 << 运算符,因此正在评估的行是:

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

你应该像这样用括号分组:

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