“+ =”和“++”的运算符层次结构的组织?

时间:2017-09-09 19:29:52

标签: java operators

我对以下短代码片段感到有点困惑,为什么结果不是4,而是3?

int i = 1;
i += ++i;
System.out.println(i);

我的想法是:

  1. 计算右侧,++ii为2;
  2. 在此时间点计算+=i = i + 2,我认为i现在应为4,但结果为3。

2 个答案:

答案 0 :(得分:10)

  

计算右侧,++ i

不,那不是第一步。

第一步是评估左侧侧的原始值。然后评估右侧。求它们,并将结果分配给变量。

所以

i += ++i;

大致相当于

i = i + (++i);

特别是从JLS 15.26.2,强调我的:

  
      
  • 否则,保存左侧操作数的值,然后评估右侧操作数。如果此评估突然完成,则赋值表达式会因同样的原因而突然完成,并且不会发生任何分配。

  •   
  • 否则,左侧变量的保存值和右侧操作数的值用于执行复合赋值运算符指示的二元运算。如果此操作突然完成,则赋值表达式会因同样的原因而突然完成,并且不会发生任何分配。

  •   

答案 1 :(得分:5)

Evaluation Order如下:

i += ++i;

=> i = i + ++i;  
=> i = 1 + ++i;
=> i = 1 + 2;
  

Java编程语言保证了操作数   运算符似乎在特定的评估顺序中进行评估,   即,从左到右。