java关于break,continue 跳转标签的细节

关于break,continue
这两个关键字的用法很简单,但是break flag 与 continue flag就非常少见了,因为这种写法可读性很差,很多公司都不支持员工采用这样的写法,还有一个原因,就是会造成代码混乱。
虽然这样的写法都不推荐用,但是毕竟作为java的语法,我们还是要懂得写,懂得用。
有以下几个要注意的地方

  1. 标签定义必须在continue flag,break flag 的前面。
    如果写在continue 与 break 的后面的话,会出现找不到标签,编译通不过
  2. 标签定义的后面一个语句不能是声明或定义语句
    这是java语法规定的,声明或定义语法之前是不能带标签的。
  3. continue 与 continue flag 只能出现在循环中
    continue与continue flag 只能出现在循环块中,出现在普通的代码块里,编译会通不过,而且 continue后面的 flag,只能是循环flag。
  4. break只能出现在循环与switch里,break flag 可以出现在方法里的任何地方,但是,除了在循环与switch里,出现在别的地方都没啥意义。
  5. 标签的作用域,仅在标签的后一语句有效,后面第二个语句无法识别标签。
    标签不属于语句,仅仅只是个符号,冒号后面的第一个语句才能识别该标签,再往后的语句都不能识别该标签了。标签命名与变量命令要求一样,而且标签命名不与变量命名冲突。也就是标签名字可与变量名字一样。
  6. 在多级for循环里写continue flag ,与 break flag 有以下几点细节
    1. 如果 flag定义在continue所在的层次循环,那么continue 等价于 continue flag
    2. 如果flag定义在break所在的层次循环,那么break 等价于 break flag
    3. continue flag 表示跳转到flag所对应的那个循环,但是并不会执行for里面的第一条定义语句,而且会执行for的第三条语句(i++或i–),然后再执行for的第二条条件判断语句,等价于flag对应的循环里面的循环里的一句break。
    4. break flag 表示中断flag所对应的那个循环,也就是直接跳出来了,这个用法是用的最多的,可以满足不用return,中断多级嵌套循环。
  7. 不在循环里用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");
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值