在 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
.
+
比移位运算符具有更高的优先级,因此 1<<2 + 1<<3
与 1 << (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);
所以我只是尝试在 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
.
+
比移位运算符具有更高的优先级,因此 1<<2 + 1<<3
与 1 << (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);