所以前几天我在查看 Java 字节码的 wikipedia 页面时遇到了这个例子:
考虑以下 Java 代码:
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
Java 编译器可能会将上面的 Java 代码翻译成如下的字节码,假设上面的代码放在一个方法中:
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
16: iload_1
17: iload_2
18: irem
19: ifne 25
22: goto 38
25: iinc 2, 1
28: goto 11
31: getstatic #84; //Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_1
35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V
38: iinc 1, 1
41: goto 2
44: return
而且我注意到 goto 这个小词出现了几次,在检查JVM规范时它是有效的。 我的问题是为什么? GOTO 在 Java 中是一个保留但不可用的关键字,所以为什么当我们编写和编译 java 代码时,它似乎被 goto 编译回它。我想知道这只是在较低级别的编程中一直做的事情,或者是否是因为 JVM 被信任可以更有效地使用 goto 字。最终,我很好奇为什么 goto 被认为是如此糟糕的做法,以至于它在 java 代码中被禁止,但在编译时似乎直接放回你的代码中。