在学习C语言的时候讲到过一个 goto 当时老师提醒我们,让我们慎用。最后学习java的时候发现已经没有goto了。
然而在JAVA中也有能实现类似的跳转操作,这与break和continue这两个关键词有关。
标签
标签是后面根由冒号的标识符
label:
在JAVA中,标签起作用的唯一的地方刚好是在迭代语句之前。如果想实现一个功能是终止迭代并从头开始这个用标签就特别方便了。
既然同时说道break和continue这两个关键词,那他们之间一定有一些联系与区别
label:
outer-interation{
inner-interation{
break;(1)
continue;(2)
continue label;(3)
break label;(4)
}
}
上面的代码是不可以跑的,只是书上的例子
在(1)中,break终断内部循环,继续外部循环;
在(2)中,continue是指后面的代码不执行了,直接到当前(内部)循环的开始处;
在(3)中,continue label 同时终断内部和外部循环,直接跳转到label处,随后从头开始两个循环;
在(4)中,break label 同时终断内部和外部循环,直接跳转到label处,随后不再进入两个循环;
针对for循环的话,有一个递增表达式,如果break了会不会执行了呢?
System.out.println("label1");
label1:
for (int i = 0; i < 5; i++)
{
if (i == 2) {
continue label1;
}
System.out.println("i: " + i);
}
输出
label1
i: 0
i: 1
i: 3
i: 4
根据输出结果来看,i=2的哪一步没有输出,也就是说在 continue label1之后的代码没有被执行,直接跳到了label1处,然后重新开始了循环,但是初始化int i = 0这个也没有执行,因为它只执行一次,因为i是从2开始的。
再来看一个例子,证明一下break是会跳过for循环的递增操作的;
int i = 0;
outer:
for(;true;)
{
inner:
for(; i < 10 ;i++)
{
System.out.println("i = " + i);
if(i == 2)
{
System.out.println("continue");
continue;
}
if(i == 3)
{
System.out.println("break");
// i++;
break;
}
}
}
这个的输出是不会用终点的,因为i会永远等于3,永远 break到外层循环,然后再进入内层,一直循环下次,永无止境。所以想要i增长需要自己进行操作。
另:continue label也会跳过for循环的递增步骤