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ます。

2 番目の if は、内側の for ループから抜け出すだけであることに注意してください。

ここにあなたの2つのif条件があります: -

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

反復: -

1)。j = 0, k = 0: - 0 を出力します。最初ifは失敗し、2 番目はif成功します。内側のループから抜け出します。アウターにつづく(j++)

2)。j = 1, k = 0: - 出力 1. 最初ifに失敗し、2 番目に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は失敗します。2 番目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 に答える