正如我从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 会采取另一种方式呢?