关于break,continue
这两个关键字的用法很简单,但是break flag 与 continue flag就非常少见了,因为这种写法可读性很差,很多公司都不支持员工采用这样的写法,还有一个原因,就是会造成代码混乱。
虽然这样的写法都不推荐用,但是毕竟作为java的语法,我们还是要懂得写,懂得用。
有以下几个要注意的地方
- 标签定义必须在continue flag,break flag 的前面。
如果写在continue 与 break 的后面的话,会出现找不到标签,编译通不过 - 标签定义的后面一个语句不能是声明或定义语句
这是java语法规定的,声明或定义语法之前是不能带标签的。 - continue 与 continue flag 只能出现在循环中
continue与continue flag 只能出现在循环块中,出现在普通的代码块里,编译会通不过,而且 continue后面的 flag,只能是循环flag。 - break只能出现在循环与switch里,break flag 可以出现在方法里的任何地方,但是,除了在循环与switch里,出现在别的地方都没啥意义。
- 标签的作用域,仅在标签的后一语句有效,后面第二个语句无法识别标签。
标签不属于语句,仅仅只是个符号,冒号后面的第一个语句才能识别该标签,再往后的语句都不能识别该标签了。标签命名与变量命令要求一样,而且标签命名不与变量命名冲突。也就是标签名字可与变量名字一样。 - 在多级for循环里写continue flag ,与 break flag 有以下几点细节
- 如果 flag定义在continue所在的层次循环,那么continue 等价于 continue flag
- 如果flag定义在break所在的层次循环,那么break 等价于 break flag
- continue flag 表示跳转到flag所对应的那个循环,但是并不会执行for里面的第一条定义语句,而且会执行for的第三条语句(i++或i–),然后再执行for的第二条条件判断语句,等价于flag对应的循环里面的循环里的一句break。
- break flag 表示中断flag所对应的那个循环,也就是直接跳出来了,这个用法是用的最多的,可以满足不用return,中断多级嵌套循环。
- 不在循环里用break flag 语句,没有任何实际效果,无意义
当编译器遇到到不是循环里的break flag时,会直接跳过这个代码。所以这种写法没有意义。
对比一下java代码与class代码
java代码:
public static void gotoFlag() {
int i, j = 0;
ff:
System.out.println("不是循环");
fg:
for (i = 0; i < 10; i++) {
System.out.println("j的值为:" + j);
gf:
System.out.println("第一个循环" + i);
gg:
for (j = 0; j < 10; j++) {
System.out.println("第二个循环" + j);
// if (j == 1) continue; //等价于continue gg
// if (j == 3) break; //等价于break gg
if (j == 5) continue fg;
if (j == 7) break fg;
System.out.println("j=" + j);
}
}
gn:
System.out.println("循环gn");
// continue gn;
gb:
// System.out.println("循环gb");
break gb;
}
class代码:
public static void gotoFlag() {
int j = 0;
System.out.println("不是循环");
label28:
for(int i = 0; i < 10; ++i) {
System.out.println("j的值为:" + j);
System.out.println("第一个循环" + i);
for(j = 0; j < 10; ++j) {
System.out.println("第二个循环" + j);
if (j == 5) {
break;
}
if (j == 7) {
break label28;
}
System.out.println("j=" + j);
}
}
System.out.println("循环gn");
}