如何跳出當前的多重循環?

最近看到一個筆試題:
如何跳出當前的多重循環?
但是看到好多的答案:break,return,覺得這個答案似乎有些不妥

於是仔細推導一番

首先,不建議使用return跳出循環,題目也說到了是多重循環,
如果使用return的話,會跳出整個函數,那後續的代碼豈不是無法執行

所以在這裏,整理了一下自己的看法,
目前瞭解到的一些循環有for,while,do while,switch
下面一一說明
public static void main(String[] args) {

//使用break,或者標記break
ok:for(int i=0;i<10;i++){
System.out.println("xxx");
for(int j=0;j<10;j++){
if(j>2)
break;//==return;
System.out.println(j);
}
}
這裏需要說明的是,ok是用來標記跳出哪一個循環
當ok標記在第一層(最外層)循環的時候,相當於return的功能,跳出整個循環
"xxx"只會輸出一次
而當ok標記在第二層的時候,將相當於break的功能,只跳出當前的循環
而"xxx"會在不執行第二層的情況下,完成第一層的循環
for(int i=0;i<10;i++){
System.out.println("xxx");
ok:for(int j=0;j<10;j++){
if(j>2)
break ok;//==break;
System.out.println(j);
}
}


//使用自定義的boolean變量,配合循環條件一起共同滿足方可執行循環
//另外需要注意的時候,在跳出條件成立時,不僅設置flag的值,同時也要加上break


這裏需要說明的是,!flag是用來標記跳出哪一個循環
當!flag標記在第一層(最外層)循環的時候,如果跳出條件成立,則會關閉第一層的循環
相當於return;的功能
boolean flag=false;
for(int i=0;i<5&&!flag;i++){
System.out.println("xxx");
for(int j=0;j<5;j++){
if(j>2){
flag=true;break;
//上面兩句的功能等價於 return;
}
System.out.println(j);
}
}

當!flag標記在第二層的時候,
程序會先執行一次"xxx",然後再執行第二層循環,當跳出條件成立時,就關閉當前的循環
而下一次循環時,只會執行第一層的循環,記住,這個!flag是關閉循環,而不是跳出
boolean flag=false;
for(int i=0;i<5;i++){
System.out.println("xxx");
for(int j=0;j<5&&!flag;j++){
if(j>2){
flag=true;
break;
}
System.out.println(j);
}
}

最後一種纔是所謂的break,由一層循環開始,到第二層。
當跳出條件成立,就跳出當前的循環,
繼而又從一層開始循環,在到第二層,又等到跳出條件成立,從一層開始
周而復始
for(int i=0;i<5;i++){
System.out.println("xxx");
for(int j=0;j<5;j++){
if(j>2){
break;
}
System.out.println(j);
}
}

另外,對於while和switch都可使用標記,但是貌似switch目前還不會用boolean值做條件

int i=0;
ok:while(true){
i++;
System.out.println(i);
if(i==5)
break ok;
}

int i=0;
boolean flag=false;
while(true&&!flag){
i++;
System.out.println(i);
if(i==5)
flag=true;
}


int i=0;
ok:do{
i++;
System.out.println(i);
if(i==5)
break ok;
}while(true);

int i=0;
boolean flag=false;
do{
i++;
System.out.println(i);
if(i==5)
flag=true;
}while(true&&!flag);

貌似 switch只能用標記吧
int x=3;
ok:switch(x){
case 1:
x*=10;
break;
case 2:
x*=10;
break;
case 3:
x*=10;
break ok;
case 4:
x*=10;
break;
default:
x=0;
}
System.out.println(x);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章