JVM仕様からわかるように、このコードは次のとおりです。
void spin() {
int i;
for (i = 0; i < 100; i++) {
; // Loop body is empty
}
}
次のようにコンパイルする必要があります。
0 iconst_0
1 istore_1
2 goto 8
5 iinc 1 1
8 iload_1
9 bipush 100
11 if_icmplt 5
14 return
条件チェックif_icmplt
はループ本体の後にありますが、自分でコンパイルして javap で表示すると、次のように表示されます。
0: iconst_0
1: istore_1
2: iload_1
3: bipush 100
5: if_icmpge 14
8: iinc 1, 1
11: goto 2
14: return
ループ条件はサイクル本体の前です。なぜこれが起こるのですか?
body の後に条件を配置すると、サイクルごとに goto を実行できなくなり、論理的に見えます。では、なぜOracleJDKは別の方法をとっているのでしょうか?