2012-11-09 92 views
1

我只是在做塞拉 - 貝茨SCJP學習指南,我想知道有關的以下問題:標記的break語句...其中未來

public class Wind { 

    public static void main(String[] args) { 

    foreach: 
     for(int j=0; j<5; j++) { 
     for(int k=0; k< 3; k++) { 

      System.out.print(" " + j); 
      if(j==3 && k==1) break foreach;  //1 
      if(j==0 || j==2) break; 

     } 
     } 

    } 
} 

當k的值等於1,打破的foreach被執行(在第1行),迭代的確切位置在這之後,我腦海中是否現在退出整個循環。下一個迭代點在哪裏?如果外部循環退出,還有什麼進一步的迭代? 研究書中給出的答案是0111233.我看到它的方式,在整個循環退出之前只打印01。不是?

+3

您是否嘗試過執行它?如果你執行它,你所有的問題都會得到解決。 –

+0

是的,而0111233是我得到的。所以考慮到這一點,在foreach運行結束並執行返回到外部循環@Santosh的開始之後,j的值必須保持爲1,這是否爲真,外部循環的迭代是否如continue語句那樣發生?當j保持爲1時,內部循環會再發生兩次迭代,在break foreach點之前打印添加到01的11? –

+0

@ donoughsugre ..不,這是不正確的。你的'break foreach'只會執行一次,然後它會突破你的外部循環,從而停止迭代。請參閱[我的答案](http://stackoverflow.com/a/13311676/1679863),我已經發布了完整的逐步迭代。 –

回答

1

究竟哪裏迭代後該走了,我的腦海裏做到這一點,現在 退出整個循環

是的,因爲你是打破了外循環。所以,它會退出你可以說的整個循環。

下一個迭代點在哪裏?

打破外循環後沒有迭代。

如果退出外部循環,怎麼會有進一步的迭代?

不,不會有任何進一步的迭代。爲什麼你會期待進一步的迭代?當你跳出一個循環時,那個循環的進一步迭代將不會運行。

爲了獲得輸出,請嘗試一步一步地遍歷代碼。拿出紙和鉛筆,並且對於每個迭代,寫入j and k的值,並且看看哪個if每次都被執行。

請注意,您的第二個if僅僅是內循環。

有以下兩個條件,如果: -

if(j==3 && k==1) break foreach;  // 1 
    if(j==0 || j==2) break;    // 2 

迭代: -

1)。 j = 0, k = 0: - 打印0.第一個if失敗,第二個if成功。你打破了內在循環。繼續與外(j++)

2)。 j = 1, k = 0: - 打印1.第一個if失敗,第二個if失敗。繼續內循環(k++)

3)。 j = 1, k = 1: - 打印1. if都失敗。繼續內循環(k++)

4)。 j = 1, k = 2: - 打印1. if都失敗。繼續內循環(k++)

5)。 j = 1, k = 3: - 內部循環條件失敗。繼續外環(j++, k = 0)

6)。 j = 2, k = 0: - 打印2.第一個if失敗。第二個if成功。打破內部循環。繼續外環(j++)

7)。 j = 3, k = 0: - 打印3. if都失敗。繼續內部循環。 (k++)

8)。 j = 3, k = 1: - 打印3.首先if成功。打破了外部循環。迭代結束。

現在看看,什麼是打印語句: -

0111233 
+0

是的,我想我現在看到它。感謝您的幫助Rohit。 –

+0

@ donoughsugrue ..不客氣:) –

+0

@ donoughsugrue。並記住[**標記此答案爲接受**](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

0

這可能是一個比較容易看到更好的印刷:

public class Temp { 
    public static void main(String[] args) { 
    foreach: for (int j = 0; j < 5; j++) { 
     System.out.println("Outer(j=" + j + ")"); 
     for (int k = 0; k < 3; k++) { 
     System.out.println("Inner (j=" + j + "; k=" + k +")"); 
     if (j == 3 && k == 1) break foreach; // 1 
     if (j == 0 || j == 2) break; 
     } 
     System.out.println("Outer - after inner loop"); 
    } 
    System.out.println("Not in a loop"); 
    } 
} 

一般的規則是,一個break語句移動執行到跟隨它的循環之外的第一個聲明。當循環本身是另一個循環體中的最後一個語句時,這可能會有點令人困惑,因爲內部循環後面的語句是外部循環的循環機制(即while循環的測試或者動作和測試一個for循環)

非限定的break語句退出內部循環,然後完成外部循環的當前迭代(它在「內部循環之後」說的地方)。

合格的break語句退出外循環並轉到外for循環之後的第一條語句。

這將導致以下輸出。

Outer(j=0) 
Inner (j=0; k=0) 
Outer - after inner loop 
Outer(j=1) 
Inner (j=1; k=0) 
Inner (j=1; k=1) 
Inner (j=1; k=2) 
Outer - after inner loop 
Outer(j=2) 
Inner (j=2; k=0) 
Outer - after inner loop 
Outer(j=3) 
Inner (j=3; k=0) 
Inner (j=3; k=1) 
not in a loop 
+0

是的,這和Rohit的回答比我的回答更有意義......謝謝Mel。 –