[C]都不提倡用goto,那怎么从多重循环中跳出呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C]都不提倡用goto,那怎么从多重循环中跳出呢?相关的知识,希望对你有一定的参考价值。

从多重循环中跳出!!!
有点责任心行不大哥

参考技术A 用break和continue break可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
continue 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一词是否执行循环的判定

两句话的区别是:break是结束整个循环过程,不再判断执行循环的条件是否成立
参考技术B 在java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的的break语句,即可跳出外层循环。例如:
ok:
for(int
i=0;i<10;i++)

for(int
j=0;j<10;j++)

system.out.println("i="+i+",j="+j);
if(j==5)break
ok;


不过我个人觉得通常不使用标号这种方式,而是让外层的循环条件表达式的结果可以收到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
int
arr[][]=1,2,2,2,2,5,4,4;
boolean
found
=false;
for(int
i=0;i<arr.length&&!found;i++)

for(int
j=0;j<arr[i].length;j++)

system.out.println("i="+i+",j="+j);
if(arr[i][j]==5)

found=true;
break;


Java跳出多重循环

场景:很多的时候需要做到跳出多重循环,而在Java中虽然后goto关键字,但是是保留字,并没有启用。而在处理分支结构的if...else,switch...case,好像都达不到想要的效果。

作为终止当前代码的return并不能完成业务需求,能用到的只有break,但是break只能跳出当前的循环。

代码示例:break

        private static void testBreak() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.println("testBreak==j==" + j);
                if (j == 2)
                    break;
            }
            System.out.println("testBreak==i====>>>" + i);
        }
        System.out.println("testBreak======>>>END");
    }        

结果:

testBreak==j==0
testBreak==j==1
testBreak==j==2
testBreak==i====>>>0
testBreak==j==0
testBreak==j==1
testBreak==j==2
testBreak==i====>>>1
testBreak==j==0
testBreak==j==1
testBreak==j==2
testBreak==i====>>>2
testBreak======>>>END

结论:所有的执行到 j==2 的时候都会终止但是只能跳出当前循环。

 

解决方案一:继续使用break,但是在添加一个flag作为判断条件,每次判断条件的时候都会判断循环和flag.

代码:

       private static void outloopByBreak() {
        boolean flag = true;
        for (int i = 0; i < 3 && flag; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.println("outloopByBreak==j==" + j);
                if (j == 2) {
                    flag = false;
                    break;
                }
            }
            System.out.println("outloopByBreak==i====>>>" + i);
        }
        System.out.println("outloopByBreak======>>>END");
    }    

结果:

outloopByBreak==j==0
outloopByBreak==j==1
outloopByBreak==j==2
outloopByBreak==i====>>>0
outloopByBreak======>>>END

结论:能解决跳出循环的问题,但是是会在内部循环的完成之后继续往下执行,知道下次判断才会跳出循环。

 

解决方案二:Java中break有一种用法可以做到类似goto的效果,在需要跳出的循环之前加一个标志之后break 标志;可以做到跳出循环(推荐使用)

代码:

    private static void outloopByBreakLikeGoto() {
        flag: for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.println("outloopByBreakLikeGoto==j==" + j);
                if (j == 2) break flag;
            }
            System.out.println("outloopByBreakLikeGoto==i====>>>" + i);
        }
        System.out.println("outloopByBreakLikeGoto======>>>END");
    }

结果:

outloopByBreakLikeGoto==j==0
outloopByBreakLikeGoto==j==1
outloopByBreakLikeGoto==j==2
outloopByBreakLikeGoto======>>>END

结论:做到了类似goto的效果

 

解决方案三:try...catch方式也能做到跳出多重循环的效果

代码:

        private static void outloopByTryCatch() {
        try {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 5; j++) {
                    System.out.println("outloopByTryCatch==j==" + j);
                    if (j == 2) 
                        throw new Exception();
                }
                System.out.println("outloopByTryCatch==i====>>>" + i);
            }
        } catch (Exception e) {
            System.out.println("====>>outloopByTryCatch跳出");
        }
        System.out.println("outloopByTryCatch======>>>END");
    }        

结果:

outloopByTryCatch==j==0
outloopByTryCatch==j==1
outloopByTryCatch==j==2
====>>outloopByTryCatch跳出
outloopByTryCatch======>>>END

结论:用抛异常的方式跳出,但是不推荐

以上是关于[C]都不提倡用goto,那怎么从多重循环中跳出呢?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中,如何跳出当前的多重嵌套循环?

在 Java 中,如何跳出当前的多重嵌套循环?

break label;语句的使用

在Java中,如何跳出当前的多重嵌套循环?

C语言实例第08期:使用goto语句从循环中跳出

Java跳出多重循环