継続はどのように機能しますか?質問する

継続はどのように機能しますか?質問する

「continue」がどのように動作するかを理解しようとしています。キーワードの概念は理解しましたが、別のプログラムを実行すると動作が異なります :-/ いくつか例を挙げてみましょう:

このプログラムを実行すると:

int j = 0;
int i = 0;
LABEL1: for (; i < 3; i++) {
  if (true)
    continue;
}

i の値は 3 になります。ここまでは順調です。外側のループを追加しましょう:

int j = 0;
int i = 0;
LABEL2: for (; j < 3; j++) {
  LABEL1: for (; i < 3; i++) {
    if (true)
      continue LABEL2;
  }
}

i の値は... 0 になります!! continue が外側のループに移動するラベルで使用される場合、i が増分されない理由がわかりません。誰か理由を説明してもらえますか? break や do {} while でそのようなトリッキーなことはありますか?

どのようなご支援でもいただければ本当に感謝いたします。

ベストアンサー1

基本的なforステートメント構造は次のとおりです。

ステートメントの基本:
for ( [ForInit] ; [式] ; [ForUpdate] ) ステートメント

さて、JLS §14.14.1.3.for文の突然の完了:

もし、声明突然完了するcontinueラベルなし次の 2 つの手順が順番に実行されます。

  1. 初め、もし更新用部分が存在する場合、式は評価される左から右へ順に並べます。値がある場合は破棄されます。更新用部品が存在しない場合は、アクションは実行されません。

  2. 次に、別のfor反復ステップが実行されます。

もし、声明突然完了するcontinueラベル付きL、選択肢があります:

  • forステートメントにラベルがある場合はL、次の 2 つのステップが順番に実行されます。

    1. まず、更新用部分が存在する場合、式は左から右へ順に評価され、値があれば破棄されます。更新用存在しない場合は、アクションは実行されません。

    2. 次に、別のfor反復ステップが実行されます。

  • for文にラベルがない場合Lforラベル付きの continue により文は突然完了しますL

(強調は筆者による)

更新用あなたの場合、 は ですi++。上記に基づいて:

  • 最初のスニペットは最初のケースに該当するため、i増分されます。

  • 2 番目のスニペットは 2 番目のケースに該当するため、ステートメントが突然完了するiため増分されません。for

continue LABEL12 番目のスニペットにこれがあった場合、i最初のスニペットと同様に (JLS に従って) 増加されることに注意してください。

将来へのヒントとして、決定的言語のルールや意味論に関する答えは、いつも言語仕様を参照してください。Javaの場合、JLS

おすすめ記事