考虑下面的代码:为什么10 >> 2 + 5 >> 2评估为零?
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
运行时,(令人惊讶的)输出为0
为什么会这样呢?
考虑下面的代码:为什么10 >> 2 + 5 >> 2评估为零?
int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
运行时,(令人惊讶的)输出为0
为什么会这样呢?
以Java的operator precedence(尤其是+
比>>
更高的优先级),并结合规则考虑,表达的是相当于
(a >> (2 + b)) >> 2
或
(10 >> (2 + 5)) >> 2
这是零。
如果您需要在转移前除了要发生,parenthesise他们:
(a >> 2) + (b >> 2)
因为它就像写(Operator Precedence):
(a >> (2 + 5)) >> 2
这就像写:
(10 >> 7) >> 2
哪个是0,为什么?
想想10的二进制表示,假设8位:
00001010
现在,向右移位7它,你会右移2得到0。Shift键,你仍然会得到0 。
运算符优先级!
如果你的代码可以用不同的方式解释,那么它几乎肯定会有一天。总是使用括号 - 永远不要依赖于运算符优先级。
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
感谢您的快速重播......它的罚款。 –