标签打破声明......下一步

时间:2012-11-09 15:59:43

标签: java

我正在做Sierra-Bates SCJP学习指南,并对以下问题感到疑惑:

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并且执行break foreach时(在第1行),在此之后迭代的确切位置,在我看来,这现在退出整个循环。下一个迭代点在哪里?如果退出外部循环,还有什么进一步的迭代? 研究书中给出的答案是0111233.我看到它的方式,在整个循环退出之前只打印01。不是吗?

2 个答案:

答案 0 :(得分:1)

  

在此之后迭代的确切位置,我的脑海里现在就这样做了   退出整个循环

是的,因为你正在打破外循环。所以,它会退出你可以说的整个循环。

  

下一个迭代点在哪里?

中断外循环后没有迭代。

  

如果退出外部循环,还有什么进一步的迭代?

不,不会有任何进一步的迭代。为什么你会期待任何进一步的迭代?当你突破循环时,那个循环的进一步迭代将不会运行。

要获取输出,请尝试逐步执行代码。拿出纸和笔,每次迭代时写下j and k的值,然后查看每次执行if

请注意,你的第二个if只是打破了内部for循环。

以下是您的两个条件: -

  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

答案 1 :(得分: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