【发布时间】:2013-06-14 12:00:48
【问题描述】:
考虑下面的java代码:
public int main() {
int i = 1111;
for (; rules(i) != true && i < Integer.MAX_VALUE; i++) {
//LOG.debug("Testing i: " + i);
}
System.out.println("The mystery number is: " + i);
return i;
}
protected boolean rules(int nb) {
//...
}
我发现即使for循环继续求值是true,当循环体为空时,循环也会停止执行。
main 的最终结果是错误的(i 大约 98% 的时间是 16698,有时会更高/更低)。
如果我从循环体中取消注释 LOG 语句,循环将继续运行,直到循环继续评估为 false。
我使用的 JVM 是 MacOS X VM 1.6.0。
- 它是否在进行某种运行时优化?
- 这种运行时优化是否可以视为错误?
- 或者是否在 Java 规范中的某处说过,继续评估不应运行函数式操作?
ps:完整代码源 + 其单元测试可在此处获得:https://gist.github.com/dirtyhenry/5804130
更新:
- 我只通过 junit 运行代码。 junit 会为这种行为负责吗?
更新 2:
java -version
返回:
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-456-11M4508)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-456, mixed mode)
【问题讨论】:
-
正如我的问题底部提到的,完整的实现+我用来调查问题的单元测试在要点gist.github.com/dirtyhenry/5804130中提供
-
尝试从
int切换到long。也许有一个静默值溢出。 -
@spas:有趣的是,当从
int切换到long并保持一个空循环时,我得到了正确的结果。不过有趣的是,因为 16698 与 Java 中 int 的最大值相差甚远(2147483647,参见docs.oracle.com/javase/tutorial/java/nutsandbolts/…) -
如果您提及“正确”答案可能会有所帮助。 (如果不是 16 698,那又是什么呢?)另外,你能用更简单的“规则(i)”测试来重现这个吗?
-
我认为“正确”的答案是 Integer.MAX_VALUE,即当 i 增加到预期的最大值时满足循环条件
标签: java macos jvm runtime compiler-optimization