2012-11-09 49 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。 –