我有以下代码示例
int i = 1;
while(i != 0) {
i++;
}
我期待这种情况在无限循环中运行,但事实并非如此。然后,当我在while循环后打印值时,我得到了:
i value is 0.
任何人都可以告诉我究竟发生了什么吗?
答案 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
...然后循环结束
如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。
此代码没有内存问题,因为它不执行任何分配 - 它只是增加一个局部变量,完全在堆栈上。
现在它是否实际上这是另一回事 - 如果JIT能够在不执行每次迭代的情况下计算出行为是什么,它可以优化它 - 但这是一个实施细节。重要的是要理解行为背后的逻辑。
答案 1 :(得分:4)
int
是int
:对于每个i
,如果i
是int
,那么i+1
。 int
总是32位,它永远不需要更大的容器。
最后,你的循环不是无限的。