Java运算符优先级是如何工作的?

时间:2019-05-01 16:44:14

标签: java operator-precedence

我想问一个简单的问题。

我提供了一个非常简单的计算示例,得出的结果与我的预期不同。 有人可以解释我做错了哪一步吗?

public static void main(String[] args) {
       int x  =1;
       int y = 101;
       int a = 2;


       int z =  ++y + y * a << 3 *2 * ++x + (x+=2);
       /*
       Step 1 int z =  ++y + y * a << 3 *2 * ++x + (3);
       Step 2 int z =  102 + 102 * 2 << 3 *2 * 4 + (3);
       Step 3 int z =  102 + 204 << 24 + (3);
       Step 4 int z =  306 << 27;
       Expected:41,070,624,768‬
        */

       System.out.println(z);
       //Actual: 20,054,016
   }

1 个答案:

答案 0 :(得分:1)

bit-shift operators的优先级低于加法运算符,加法运算符的优先级低于乘法运算符,乘法运算符的优先级低于增量/减量运算符。另外请注意,无论变量之间的运算符优先级如何,变量都是从左到右求值的。

int z =  ++y + y * a << 3 *2 * ++x + (x+=2);

首先,递增。

102 + 102 * 2 << 3 * 2 * 2 + 4

下一步,进行乘法。

102 + 204 << 12 + 4

然后添加。

306 << 16

位移导致20054016

在对最右边带有x的表达式求值时,您似乎犯了错误。