在Java中,为什么在计算表达式的其余部分之前,括号中的赋值不会出现?

jor*_*npg 4 java operator-precedence

考虑

int a = 20;
a = a + (a = 5); // a == 25, why not 10?
Run Code Online (Sandbox Code Playgroud)

请问括号是否胜过所有优先规则?在评估某些表达式之前,RHS是否预先填充了某些变量?

ars*_*jii 5

因为a在您拥有的示例中首先加载,然后评估括号中的位.如果您颠倒了订单:

int a = 20;
a = (a = 5) + a;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
10

......你确实得到10.表达式从左到右进行评估.

考虑一下:

f() + g()
Run Code Online (Sandbox Code Playgroud)

f将被召唤g.想象一下,它会是多么不直观

f() + (g())
Run Code Online (Sandbox Code Playgroud)

以前g被叫过f.

这些都在JLS§15.7.1中有详细说明(感谢@paisanco在评论中提出它).