带标签的break和continue语句

来源:互联网 发布:网络云盘哪个最好用 编辑:程序博客网 时间:2024/05/11 22:52

   尽管无标签的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);
    }
}

0 0
原创粉丝点击