我不明白为什么这个后增量方程不会增加。我原本以为在+ =操作之后,值会增加1,然后第二次我将获得1值。但输出是0零的无限循环。是否有人能够解释为什么'我'不会增加。
int i = 0;
for(; ; ) {
if ( i >= 10) break;
i += i++;
}
System.out.println(i);
答案 0 :(得分:22)
让我们检查i += i++;
i++
表示读取i
的值,然后递增i
。
i += x
表示评估i
,然后评估x
并添加2并将结果放入i
。
所以,会发生什么:
i
,0
i++
得到评估。它返回0
,i
的值设置为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!
因此无限......