我注意到一些意外的行为(相对于我个人的期望而言是意外的),我想知道是否存在 JVM 中的错误,或者这可能是我不了解某些细节的边缘情况究竟是什么应该发生。假设我们在 main 方法中有以下代码:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
一个天真的期望是这会打印Integer.MAX_VALUE-1
,最大的甚至可以表示int
。但是,我相信整数算术应该在 Java 中“翻转”,所以加 1Integer.MAX_VALUE
应该会导致Integer.MIN_VALUE
. 由于Integer.MIN_VALUE
仍然小于Integer.MAX_VALUE
,因此循环将继续遍历负偶数整数。最终它会回到 0,并且这个过程应该以无限循环的形式重复。
当我实际运行这段代码时,我得到了不确定的结果。打印出来的结果往往是 50 万左右,但确切的值会有所不同。因此,当我认为它应该是一个无限循环时,循环不仅会终止,而且它似乎是随机终止的。这是怎么回事?
我的猜测是,这要么是 JVM 中的错误,要么是正在进行的许多时髦优化导致了这种预期行为。它是哪一个?