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,为什么我上面解释的逻辑是错误的?
将其拆分为以下内容
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)