我刚刚做了这个简单的“程序”:
public static void main(String[] args) {
int i = 1;
int k = 0;
while (true) {
if(++i==0) System.out.println("loop: " + ++k);
}
}
运行这个程序后,我立即得到输出:
(...)
loop: 881452
loop: 881453
loop: 881454
loop: 881455
loop: 881456
loop: 881457
loop: 881458
(...)
好像 i
总是 0。
事实上,当我在 Eclipse 中调试时,在暂停程序时,i
将始终为零。单步执行循环时,i
会递增,但在恢复和挂起调试器时,i
再次为 0。
当我将 i
更改为 long 时,在运行程序时我需要等待很长时间才能看到第一个 loop: 1
。在调试器中,暂停程序时,i
确实会增加:它不是 0,所以它可以正常工作。
++i
作为 int 有什么问题?
最佳答案
如果你一直递增一个整数类型,它最终会溢出,变成一个很大的负值。再继续下去,最终又会变成0,循环往复。
有一些方便的方法可以帮助避免意外溢出,例如 Math.addExact()
,但这些通常不会在循环中使用。
I know that it is overflowing. I'm just puzzled that it's overflowing THAT fast. And I find it strange that each time I suspend the debugger, i is 0.
当您暂停一个正在运行的线程时,请考虑线程慢速调用 println()
并遍历大量 Java 和 native OS 代码的可能性,以及登陆的可能性你的while循环的测试,它只是增加一个局部变量。您必须有一个非常快速的扳机手指才能看到打印语句以外的任何内容。请尝试单步执行。
当某件事连续发生 40 亿次时,可以很好地猜测下一次它会发生。分支预测在任何情况下都会有所帮助,并且您的优化运行时可能会完全删除增量操作并进行测试,因为 i
的中间值永远不会被读取。
关于Java integer++i 不改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34276322/