为什么 10>>2+5>>2 的计算结果为零?
Why does 10>>2+5>>2 evaluate to zero?
考虑以下代码:
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
运行时,(令人惊讶的)输出为 0。
为什么会这样?
因为这就像写 (Operator Precedence):
(a >> (2 + 5)) >> 2
这就像写作:
(10 >> 7) >> 2
哪个是 0。为什么?
想想 10 的二进制表示,假设是 8 位:
00001010
现在,将其右移 7,您将得到 0。将其右移 2,您仍将得到 0。
考虑到Java的operator precedence(值得注意的是+
的优先级高于>>
)和结合规则,表达式等价于
(a >> (2 + b)) >> 2
或
(10 >> (2 + 5)) >> 2
这是零。
如果您需要在加法之前进行移位,请将它们括起来:
(a >> 2) + (b >> 2)
运算符优先级!
如果您的代码可以用不同的方式解释,那几乎可以肯定有一天。始终使用括号 - 永远不要依赖运算符优先级。
int a = 10, b = 5;
int c = a >> 2 + b >> 2;
System.out.println(c);
int d = (a >> 2) + (b >> 2);
System.out.println(d);
int e = ((a >> 2) + b) >> 2;
System.out.println(e);
int f = a >> (2 + b) >> 2;
System.out.println(f);
打印
0
3
1
0
考虑以下代码:
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
运行时,(令人惊讶的)输出为 0。
为什么会这样?
因为这就像写 (Operator Precedence):
(a >> (2 + 5)) >> 2
这就像写作:
(10 >> 7) >> 2
哪个是 0。为什么?
想想 10 的二进制表示,假设是 8 位:
00001010
现在,将其右移 7,您将得到 0。将其右移 2,您仍将得到 0。
考虑到Java的operator precedence(值得注意的是+
的优先级高于>>
)和结合规则,表达式等价于
(a >> (2 + b)) >> 2
或
(10 >> (2 + 5)) >> 2
这是零。
如果您需要在加法之前进行移位,请将它们括起来:
(a >> 2) + (b >> 2)
运算符优先级!
如果您的代码可以用不同的方式解释,那几乎可以肯定有一天。始终使用括号 - 永远不要依赖运算符优先级。
int a = 10, b = 5;
int c = a >> 2 + b >> 2;
System.out.println(c);
int d = (a >> 2) + (b >> 2);
System.out.println(d);
int e = ((a >> 2) + b) >> 2;
System.out.println(e);
int f = a >> (2 + b) >> 2;
System.out.println(f);
打印
0
3
1
0