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

How Java Operator Precedence exactly work?

我想问个简单的问题。

我提供了一个非常简单的计算示例,我收到的结果与我的预期不同。 谁能解释一下我哪一步做错了?

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
   }

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

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 的表达式时出错了。