次の 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) {
//...
}
true
for ループの継続評価がの場合でも、本体が空になるとループの実行が停止することがわかりました。
の最終結果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)