理解算术表达式的输出

时间:2015-01-23 05:26:29

标签: java

我有一个java类如下:

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

Output:210

在我看来,output应按{1}}计算如下:

231

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

2 个答案:

答案 0 :(得分:1)

在任何类型的陈述中:

x *= y;

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

a *= a++ + a;

相当于:

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

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

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

答案 1 :(得分:1)

考虑java规范的15.7.1. Evaluate Left-Hand Operand部分,它说 - 首先,计算左侧操作数以生成变量,然后右侧操作数的值用于执行复合指示的二进制操作赋值运算符

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