分配一个变量,实际发生了什么,Java

Rol*_*all 8 java runtime variable-assignment

在下面的例子中实际发生了什么?

int a = 1;
a += (a = 2);
Run Code Online (Sandbox Code Playgroud)

输出是3,但我想知道封面下究竟发生了什么.例如,我知道括号具有更高的优先级,+因此首先发生(a = 2)表达式应该成为a = 2 + 2.在运行时首先应该执行括号内的表达式,然后a变为2.看起来a左边的第一个在+之前得到"加载" (a = 2)并且这个最后一个表达式似乎没有覆盖先前的加载.换句话说,我对幕后究竟发生了什么感到困惑.

如果有人知道,请提前多多感谢.

Kir*_*rby 2

请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7.1中引用的示例15.7.1-2,它与您的示例几乎相同假如。尤其:

\n\n
\n

如果运算符是复合赋值运算符 (\xc2\xa715.26.2),则左侧操作数的求值包括记住左侧操作数表示的变量以及获取和保存该变量\ 在隐含的二进制运算中使用的值。

\n
\n\n

由于这种优先级,+= 的左手首先被计算。

\n\n

由于括号,您可能会感到困惑,但请注意有关括号评估的部分:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7.3,特别是:

\n\n
\n

Java 编程语言遵循括号显式指示的求值顺序和运算符优先级隐式指示的求值顺序。

\n
\n\n

在这种情况下,+= 运算符设置的隐式优先级指示将根据规范记住左侧操作数。虽然赋值运算符(包括“+=”)确实具有最低优先级,但 += 的规范表明,根据 15.26.2,将记住左侧操作数。

\n