这个计算 a -= a + a 是如何进行的?(int a = 1) 执行结果是-1,不是1

Win*_*ang -4 java

int a = 1;

a -= a + a;
Run Code Online (Sandbox Code Playgroud)

上面的代码结果是-1,我期望它是1。

但下面的代码实际上让我得到了 1

a = a - a + a
Run Code Online (Sandbox Code Playgroud)

他们不应该是一样的吗?第一个代码如何变为-1?

我试图研究加法和减法的数学运算顺序,我认为我会对它们的工作原理产生误解。但看起来我通过对计算进行从左到右的操作是正确的。

mer*_*ike 7

Java 语言规范写道

复合赋值表达式的形式E1 op= E2相当于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,但E1只计算一次。

也就是说,表达式

a -= a + a
Run Code Online (Sandbox Code Playgroud)

相当于

a = (int) ((a) - (a + a))
Run Code Online (Sandbox Code Playgroud)

其评估结果如下

a = (1) - (1 + 1)
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

-=优先级低于+,因此操作顺序为:

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

另一方面,-与 、 具有相同的优先级+,并且是左关联的,因此这里的操作顺序是:

a = ((a - a) + a);
a = ((1 - 1) + 1);
a = (   0    + 1);
a = 1;
Run Code Online (Sandbox Code Playgroud)