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

mck*_*111 4 java operators

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

int i = 1;
i += ++i;
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

我的想法是:

  1. 计算右侧,++i,i为2,则;
  2. 计算+=,i = i + 2在这个时间点,我想i应该是4了,但结果却是3.

Jon*_*eet 10

计算右边,++ i

不,这不是第一步.

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

所以

i += ++i;
Run Code Online (Sandbox Code Playgroud)

大致相当于

i = i + (++i);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @WenhuCao:优先权是关于分组.它的优先级意味着`a + b*c`被视为`a +(b*c)`而不是`(a + b)*c` - 但仍然会首先评估`a`. (2认同)

Nam*_*man 5

计算顺序是:

i += ++i;

=> i = i + ++i;  
=> i = 1 + ++i;
=> i = 1 + 2;
Run Code Online (Sandbox Code Playgroud)

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