Java 理解算术表达式的输出

Java 理解算术表达式的输出,java,Java,我有一个java类,如下所示: class A{ public static void main(String[] args){ int a=10; a*=a++ +a; System.out.println(a); } } Output:210 a*=10+11; a*=21; a=a*21; a=11*21; a= 231; 我认为,输出应为231,计算如下: class A{ public static void ma

我有一个java类,如下所示:

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

Output:210
a*=10+11;
a*=21;
a=a*21;
a=11*21;
a= 231;
我认为,
输出
应为
231
,计算如下:

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

Output:210
a*=10+11;
a*=21;
a=a*21;
a=11*21;
a= 231;

有人能解释一下我错在哪里以及为什么吗?

在任何类型的陈述中:

x *= y;
LHS的初始值在RHS之前进行评估。因此,你的声明:

a *= a++ + a;
相当于:

a = a * (a++ + a);
将a设置为值10*(10+11)=>210

如果您对与这一点相关的正式规范特别感兴趣,您可以找到它,其中包含规则“如果运算符是复合赋值运算符(§15.26.2),则对左手操作数的求值既包括记住左手操作数表示的变量,也包括获取和保存该变量的值以用于隐含的二进制操作。”

考虑java规范中的一节,其中指出-First,对左侧操作数求值以生成变量,然后使用右侧操作数的值执行复合赋值运算符指示的二进制运算


在你的情况下,它是a=10*((11)+10)=201</p>,如果你认为<代码> x*= y>代码>只是<代码> x= x*y的快捷方式,那么你可能更容易理解,那么你可以看到它是在评估乘法时使用的<<代码> A/<代码>的原始值。