Java 理解算术表达式的输出
我有一个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
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/<代码>的原始值。