带标签的break和continue语句
2014-03-06 19:34
405 查看
尽管无标签的break和continue语句非常常见,但使用标签的语句可以使程序更加紧凑,当然毫无疑问降低了程序的可读性。简单文绉绉地说下无标签的两者是如何工作的:break是退出最内层的循环结构,并跳转到该循环块之外的下一句代码执行。而continue是通常与条件配合使用,如果该循环条件满足,则会继续同一循环块内的下一次迭代。注意红色部分。如果对于break来说,要退出好几层循环,那怎么办?对于continue来说,要执行几层循环体的下一次迭代,怎么实现?请看下边关于break例子:
public class BreakLabel {
public static void main(String[] args) {
boolean isTrue = true;
outer:
for(int i=0; i<5; i++){
for(int j=0; j<30000; j++){
System.out.println("hello");
break outer; //如果没有标签,那么outer loop这句语名将被输出。正因为有标签,直接跳出两层循环
}
System.out.println("outer loop");
}
System.out.println("Good-bye");
}
}
毫无疑问,标识必须符合java命名规则,另外,标签必须直接位于被标识的循环之前,后边加冒号,基本上说明它是一个标签,与下边的紧接的这一个语句同义。而break 标签名;则来用响应标签。下例是continue使用标签的情况:
public class ContinueLabel {
public static void main(String[] args) {
outer:
for(int i=0; i<5; i++){
System.out.println("begin outer loop"); //而因为continue直接退到外层这句话被反复执行到
for(int j =0; j<3; j++){
System.out.println("Hello");
continue outer;
}
System.out.println("end outer loop~~~~~~~~~~~~``"); //因为标签这句话,不会执行到。
}
System.out.println("goodbye");
}
}
使用了标签以后,被看成一个大的循环体。break是刚性的,就象洪水冲上了堤坝一样,一下子就到此为止,有了标签,它更加胡作非为,影响力到标签所达之处。 如果大家愿意的话,看看如下代码能输出什么:
public class TestLabel {
public static void main(String[] args) {
int counter = 0;
ll: for (int i = 0; i < 10; i++) {
gg: for (int j = 0; j < 10; j++) {
if (j > i)
break gg;
if (j == i) {
counter++; //上边的条件能保证这个ll这个循环能执行结束,每一次循环都能保证counter,自增一次,除了第一次进入gg循环,i=0而j=1;被break出gg,没有执行counter++
continue ll; // A labeled continue works only with loops.
}
}
}
System.out.println(counter);
}
}
public class BreakLabel {
public static void main(String[] args) {
boolean isTrue = true;
outer:
for(int i=0; i<5; i++){
for(int j=0; j<30000; j++){
System.out.println("hello");
break outer; //如果没有标签,那么outer loop这句语名将被输出。正因为有标签,直接跳出两层循环
}
System.out.println("outer loop");
}
System.out.println("Good-bye");
}
}
毫无疑问,标识必须符合java命名规则,另外,标签必须直接位于被标识的循环之前,后边加冒号,基本上说明它是一个标签,与下边的紧接的这一个语句同义。而break 标签名;则来用响应标签。下例是continue使用标签的情况:
public class ContinueLabel {
public static void main(String[] args) {
outer:
for(int i=0; i<5; i++){
System.out.println("begin outer loop"); //而因为continue直接退到外层这句话被反复执行到
for(int j =0; j<3; j++){
System.out.println("Hello");
continue outer;
}
System.out.println("end outer loop~~~~~~~~~~~~``"); //因为标签这句话,不会执行到。
}
System.out.println("goodbye");
}
}
使用了标签以后,被看成一个大的循环体。break是刚性的,就象洪水冲上了堤坝一样,一下子就到此为止,有了标签,它更加胡作非为,影响力到标签所达之处。 如果大家愿意的话,看看如下代码能输出什么:
public class TestLabel {
public static void main(String[] args) {
int counter = 0;
ll: for (int i = 0; i < 10; i++) {
gg: for (int j = 0; j < 10; j++) {
if (j > i)
break gg;
if (j == i) {
counter++; //上边的条件能保证这个ll这个循环能执行结束,每一次循环都能保证counter,自增一次,除了第一次进入gg循环,i=0而j=1;被break出gg,没有执行counter++
continue ll; // A labeled continue works only with loops.
}
}
}
System.out.println(counter);
}
}
相关文章推荐
- Android-UI-Utils
- The web.config file for this project is missing the required DirectRequestModule.
- easyui panel 使用汇总
- uitableview分页
- linuix下递归删除svn文件
- IOS-UITableView之刷新某一行
- PAT (Advanced) 1041. Be Unique (20)
- UI组件: 向皮肤注入Callback函数是否有必要?是否有更合理的结构?----取消本文章
- 【初学qml之麻烦篇】:(1)依据坐标,判断某处的Item
- UITextField滑动防止被键盘挡住 终极解决方案
- NSInteger 与 NSUInteger 和 int与 NSInteger 区别(转)
- ajax在easyui里面的应用举例2-登录验证
- ajax在easyui中使用实例
- codeblocks-error: Illegal byte sequence
- iPhone应用开发 UITableView学习点滴详解
- iPhone应用开发 UITableView学习点滴详解
- 关于UILabel的多行显示 UILabel numberOfLines
- Lock request conflicts with an established lock
- Laying Out iOS UIs in Code
- uiview图片倒影设置