最近看到一個筆試題:
如何跳出當前的多重迴圈?
但是看到好多的答案: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);