为什么在while循环中递增int原语不会永远循环

时间:2014-01-13 06:56:19

标签: java increment post-increment

我有以下代码示例

int i = 1;  

while(i != 0) {  
    i++;  
} 

我期待这种情况在无限循环中运行,但事实并非如此。然后,当我在while循环后打印值时,我得到了:

i value is 0.  

任何人都可以告诉我究竟发生了什么吗?

2 个答案:

答案 0 :(得分:17)

  

我原本期望它在无限循环中运行,但事实并非如此。

不,它不会。 最终该值将再次变为0。

特别是,它将在逻辑上执行如下:

1
2
3
...
2,147,483,646
2,147,483,647  
-2,147,483,648  // Integer overflow => wrapping
-2,147,483,647
...
-3
-2
-1
0

...然后循环结束

来自section 15.18.2 of the JLS

  

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。

此代码没有内存问题,因为它不执行任何分配 - 它只是增加一个局部变量,完全在堆栈上。

现在它是否实际上这是另一回事 - 如果JIT能够在不执行每次迭代的情况下计算出行为是什么,它可以优化它 - 但这是一个实施细节。重要的是要理解行为背后的逻辑。

答案 1 :(得分:4)

intint:对于每个i,如果iint,那么i+1int总是32位,它永远不需要更大的容器。

最后,你的循环不是无限的。