理解算术表达式的输出
我有一个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