后增量无限循环i + = i ++;

我不明白为什么这个后增量方程不会增加。 我原本以为在+ =操作之后,值会增加1,然后第二次我将获得1值。 但输出是0零的无限循环。 有人能够解释为什么’我’不会增加。

int i = 0; for(; ; ) { if ( i >= 10) break; i += i++; } System.out.println(i); 

虽然来自@ njzk2的答案是正确的,但指出它为什么是正确的是有用的。

还有其他可能性 – 例如,为什么Java在赋值后不执行postincrement运算符? (答案:因为那不是Java语言设计师所选择的)

复合赋值的评估顺序(如+= )在Java语言规范部分15.26.2中指定。 我将引用它如何为Java 8定义 :

  • 首先,评估左侧操作数以产生变量。 如果此评估突然完成,则赋值表达式出于同样的原因突然完成; 不评估右侧操作数,也不进行赋值。

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

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

  • 否则,二进制操作的结果将转换为左侧变量的类型,经过值集转换(第5.113节)到相应的标准值集(不是扩展指数值集),结果转换的内容存储在变量中。

最重要的是首先保存左手表达式的值,然后完全评估右手,然后将复合操作的结果存储在左侧的变量中。

我们来看看i += i++;

i++表示读取i++的值,然后递增i

i += x表示计算i ,然后计算x并添加2并将结果放入i

那么,会发生什么:

  • i得到评估,它是0
  • i++被评估。 它返回0i的值设置为1
  • i += i++现在是i = 0 + 0
  • i = 0

尝试使用++i来获取增量的结果,然后再读取它的值。

毫不奇怪,你正在进入无限循环..

 class Demo{ public static void main(String[] args){ int i = 0; for( ; ; ) { if (i >= 10) break; i = i+i++; System.out.println(i); } } } 

假设上面的代码,我刚刚用增量替换你的行代码。

现在,最初i = 0; 所以

 i = i+i++ 

导致i = 0 + 0 //现在我是1

但最后你再次让我等于0!

因此无限……