1

我只是在做 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 在整个循环退出之前被打印出来。不 ?

4

2 回答 2

1

在此之后迭代到底在哪里,在我看来,现在是否退出整个循环

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

下一个迭代点在哪里?

跳出外循环后没有迭代。

如果退出外部循环,如何进行进一步的迭代?

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

要获得输出,请尝试逐步执行您的代码。拿出一张纸和铅笔,为每个迭代写下 的值j and k,看看if每次执行哪个。

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

这是您的两个 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
于 2012-11-09T16:09:15.943 回答
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
于 2012-11-09T16:19:18.563 回答