理解算术表达式的输出

我有一个java类如下:

class A{ public static void main(String[] args){ int a=10; a*=a++ +a; System.out.println(a); } } Output:210 

在我看来, output应该计算如下231

 a*=10+11; a*=21; a=a*21; a=11*21; a= 231; 

任何人都可以解释一下我在哪里错了,为什么?

在任何类型的声明中:

 x *= y; 

在RHS之前评估LHS的初始值。 所以你的陈述:

 a *= a++ + a; 

相当于:

 a = a * (a++ + a); 

其中a设置为值10 *(10 + 11)=> 210。

如果您对与此相关的正式规范特别感兴趣,可以在此处找到包含规则“如果运算符是复合赋值运算符(第15.26.2节)”的规则,那么对左侧操作数的评估包括记住左侧操作数表示的变量,并获取并保存该变量的值,以便在隐含的二进制操作中使用。“

考虑15.7.1。 评估 java规范的左手操作数部分,它说 – 首先,计算左侧操作数以生成变量,然后右侧操作数的值用于执行复合赋值运算符指示的二元操作

在你的情况下,它是= 10 *((11)+10)= 201