这个 Java 程序中运算符优先级的逻辑有什么问题?

pra*_*avi 0 java operator-precedence operator-keyword

class Hello {
    public static void main(String args[]) {
        int i = 10;
        i *= i++ + i;
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据运算符的优先级,后缀运算符的优先级高于乘法运算符。括号内的操作数具有更高的优先级。

首先评估它们: i*(i++ + i) 所以,现在,括号内是 10+11: i*(21)

i 的当前值为 11

其次,由于下一个优先级计算乘法运算符,它不应该是11*21=231吗?

虽然,我知道答案是 210,为什么我上面解释的逻辑是错误的?

Wie*_*lol 5

将其拆分为以下内容

i = i * (i++ + i);
Run Code Online (Sandbox Code Playgroud)

现在,你有:

i = 10 * (i++ + i);
Run Code Online (Sandbox Code Playgroud)

然后,你有:

i = 10 * (10 + i);
Run Code Online (Sandbox Code Playgroud)

然后,你有:

i = 10 * (10 + 11);
Run Code Online (Sandbox Code Playgroud)

然后,你有:

i = 10 * (21);
Run Code Online (Sandbox Code Playgroud)

然后,你有:

i = 210;
Run Code Online (Sandbox Code Playgroud)

如您所见,首先加载“i”的值,然后完成剩余的计算,而不是相反。

编辑:介于两者之间,i 的值也设置为 11,因此第 4 步中的数字为“11”,但在那之后,它在最后被覆盖,因此该值不再重要。

交换计算将导致您想要的结果:

i = (i++ + i) * i;
Run Code Online (Sandbox Code Playgroud)