java中的复合赋值运算符

时间:2017-02-02 11:41:19

标签: java operators

int a = 2;
int b = 3;
int c = 10;

  a +=(a += b) + c; // this will be same as --> a = a+((a= a+b) +c);    
  /*                                                  2+((2=2+3)+10)
                                                   after adding 2+3
                                                   now value a = 5;
                                                    5 +((5)+10)
                                                    5 + (15)
                                                a = 20
 */
System.out.println("a: "+a); // a:17 

当我执行上述程序时,答案为a:17为什么不a:20? 据我说。 解析(a += b)后,a的值应为5(a += b) + c15,之后a +=(a += b) + c;应为20 } 请帮我理解,谢谢。

5 个答案:

答案 0 :(得分:1)

这是评估和优先顺序不匹配的一个很好的例子。它们通常会在有差异时使其混乱,因为你提到表达式是从左到右评估的,如下所示

int s = a; // stack
int t = a + b; // second stack value.
s += t;
s += c;
a = t;
a = s;

请注意,在这种情况下,(a+=b)(a+b)相同。

答案 1 :(得分:1)

理解起来有点棘手。虽然您在右侧有a += b,但这不会更改在表达式开头用于a的{​​{1}}的值;那仍然是2.例如:

a += (a += b) + c;
a = 2 + (a[still 2] += 3) + 10
a = 2 + (5) + 10
a = 17

右侧的+=实际上只是一个a += b,因为这一直都在a + b已经针对+=的右侧

JLS§15.26.2: Compound Assignment Operators中的详细信息。

答案 2 :(得分:1)

复合赋值运算符在计算第二个操作数和执行复合赋值之前存储左操作数的原始值(在此示例中为加法+赋值)。

因此

a += (a += b) + c;

相当于:

int temp = a;
a = temp + (a += b) + c;
     2   +   2 + 3  + 10 = 17

答案 3 :(得分:1)

在Java中,您可以将a += b替换为a = a + b 非常重要。

因此你的表达相当于

a = a + (a = a + b) + c

请注意,这将按照a = Term1 + Term2 + Term3和左到右的顺序进行评估。

Term1是2。

Term2是唯一棘手的问题。它是5(并且具有将a增加到5的副作用,但是会被最终的赋值所破坏。

Term3是10。

恢复总数,17。

请注意,此表达式在C和C ++中的行为未定义。

答案 4 :(得分:0)

首先你做一个+ = b所以2 + 3你有5.然后一个+ =你的答案(这里是5)所以2 + = 5 = 7.然后7 + 10 = 17