今天无意中看到一段代码,觉得挺有意思
lable:while (en.hasMoreElements()) {
type type = (type) en.nextElement();
continue lable;
}
这个·lable·我一时间竟然不知道是什么,查了一下才知道是java循环控制里的东西
在循环前边加上一个标签,循环里就可以continue或break来控制语句的跳转了
看完之后大腿都拍青了,这不就是c语言里的goto嘛
(白学java了)
fuck:
while(true) {
while(true) {
break fuck;
}
}
在循环嵌套内使用可以直接break掉fuck对应的循环体
我不禁思考java有这个东西,那为什么不叫goto
神差鬼使地敲下goto
goto
!!
goto竟然也是关键字,变色就可以体现出来
编译一下
public class java_lable {
public static void main(String[] args) {
int a = 0;
fuck:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
a = j * i;
if (a == 300) {
break fuck;
}
}
}
System.out.println("goto!");
}
}
class文件:
// Compiled from java_lable.java (version 1.8 : 52.0, super bit)
public class luogu.cn.Study.java_lable {
// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public java_lable();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 3]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: luogu.cn.Study.java_lable
// Method descriptor #15 ([Ljava/lang/String;)V
// Stack: 2, Locals: 4
public static void main(java.lang.String[] args);
0 iconst_0
1 istore_1 [a]
2 iconst_0
3 istore_2 [i]
4 goto 38
7 iconst_0
8 istore_3 [j]
9 goto 29
12 iload_3 [j]
13 iload_2 [i]
14 imul
15 istore_1 [a]
16 iload_1 [a]
17 sipush 300
20 if_icmpne 26
23 goto 44
26 iinc 3 1 [j]
29 iload_3 [j]
30 bipush 10
32 if_icmplt 12
35 iinc 2 1 [i]
38 iload_2 [i]
39 bipush 10
41 if_icmplt 7
44 getstatic java.lang.System.out : java.io.PrintStream [16]
47 ldc <String "goto!"> [22]
49 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
52 return
Line numbers:
[pc: 0, line: 6]
[pc: 2, line: 8]
[pc: 7, line: 9]
[pc: 12, line: 10]
[pc: 16, line: 11]
[pc: 23, line: 12]
[pc: 26, line: 9]
[pc: 35, line: 8]
[pc: 44, line: 16]
[pc: 52, line: 17]
Local variable table:
[pc: 0, pc: 53] local: args index: 0 type: java.lang.String[]
[pc: 2, pc: 53] local: a index: 1 type: int
[pc: 4, pc: 44] local: i index: 2 type: int
[pc: 9, pc: 35] local: j index: 3 type: int
Stack map table: number of frames 6
[pc: 7, append: {int, int}]
[pc: 12, append: {int}]
[pc: 26, same]
[pc: 29, same]
[pc: 38, chop 1 local(s)]
[pc: 44, chop 1 local(s)]
}
原来goto在jvm里是有的,在日常的使用里,goto作为保留关键字
不过在面向对象中,goto的使用频率相当低,更多的会抛出异常或使用标记来达到相同的目的
不过我觉得在面向过程式编程(算法)时,goto会帮助阅读和降低编写时的乏味