2014-01-13 152 views
2

INT原始我有下面的代码示例为什么在递增while循环不循环永远

int i = 1; 

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

我期待这一个无限循环运行,但事实并非如此。然后,当我在while循环后打印数值时,我得到:

i value is 0. 

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

+2

更重要的是,你为什么认为它*会导致内存问题?记忆在这里用完了? –

+5

'任何人都可以让我知道究竟发生了什么?' - 整数溢出。 – devnull

+1

+1,我没有看到这个问题有什么问题。 – Maroun

回答

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能够计算出什么样的行为将不会执行每次迭代,它可以优化它 - 但这是一个实现细节。重要的部分是理解行为背后的逻辑。

+0

非常感谢。是啊这真是太愚蠢了,我期待堆内存异常,而不是堆栈溢出错误。但是现在我开始知道为什么它没有在无限循环中运行,为什么没有错误。 –

+0

@SrikanthGanji:你为什么会期望堆栈溢出?循环内没有更多的堆栈内存正在分配 - 它只是用另一个值替换一个值。 –

4

一种intint:对于每个i,如果iint所以是i+1。一个int总是32位,它从不需要更大的容器。

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