Java 为什么10>&燃气轮机;2+;5>&燃气轮机;2评估为零?

Java 为什么10>&燃气轮机;2+;5>&燃气轮机;2评估为零?,java,operators,Java,Operators,考虑以下代码: int a=10, b=5; int c=a>>2+b>>2; System.out.println(c); 运行时,(意外)输出为0 为什么会这样?因为这就像写作: 这就像写作: (10 >> 7) >> 2 也就是0。为什么? 考虑10的二进制表示,假设为8位: 00001010 现在,向右移动7,你会得到0。将其右移2,仍然会得到0。考虑到Java(尤其是+的优先级高于>)和关联性规则,该表达式相当于 (a >&g

考虑以下代码:

int a=10, b=5;
int c=a>>2+b>>2;
System.out.println(c);
运行时,(意外)输出为0

为什么会这样?

因为这就像写作:

这就像写作:

(10 >> 7) >> 2
也就是0。为什么?

考虑10的二进制表示,假设为8位:

00001010
现在,向右移动7,你会得到0。将其右移2,仍然会得到0。

考虑到Java(尤其是
+
的优先级高于
>
)和关联性规则,该表达式相当于

(a >> (2 + b)) >> 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);
    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