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

时间:2017-02-14 05:35:43

标签: java increment

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

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

3 个答案:

答案 0 :(得分:22)

让我们检查i += i++;

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

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

所以,会发生什么:

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

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

答案 1 :(得分:6)

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

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

复合赋值的评估顺序(如+=)在Java语言规范部分15.26.2中指定。我引用how it is defined for Java 8

  
      
  • 首先,评估左侧操作数以生成变量。如果此评估突然完成,则为赋值表达式   因同样的原因突然完成;右手操作数不是   评估并且没有分配。

  •   
  • 否则,保存左侧操作数的值,然后计算右侧操作数。如果此评估完成   然后突然完成赋值表达式   同样的原因,没有任何转让。

  •   
  • 否则,左侧变量的保存值和右侧操作数的值用于执行二进制操作   由复合赋值运算符表示。如果这个操作   突然完成,然后赋值表达式突然完成   出于同样的原因,没有任何转让。

  •   
  • 否则,二进制运算的结果转换为左侧变量的类型,进行值集转换   (§5.1.13)到适当的标准值集(不是   扩展指数值集),转换结果是   存储在变量中。

  •   

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

答案 2 :(得分:1)

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

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!

因此无限......