「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] ) ステートメント
もし、声明突然完了する
continue
ラベルなし次の 2 つの手順が順番に実行されます。
初め、もし更新用部分が存在する場合、式は評価される左から右へ順に並べます。値がある場合は破棄されます。更新用部品が存在しない場合は、アクションは実行されません。
次に、別の
for
反復ステップが実行されます。もし、声明突然完了する
continue
ラベル付きL
、選択肢があります:
for
ステートメントにラベルがある場合はL
、次の 2 つのステップが順番に実行されます。
まず、更新用部分が存在する場合、式は左から右へ順に評価され、値があれば破棄されます。更新用存在しない場合は、アクションは実行されません。
次に、別の
for
反復ステップが実行されます。
for
文にラベルがない場合L
、for
ラベル付きの continue により文は突然完了しますL
。
(強調は筆者による)
更新用あなたの場合、 は ですi++
。上記に基づいて:
最初のスニペットは最初のケースに該当するため、
i
増分されます。2 番目のスニペットは 2 番目のケースに該当するため、ステートメントが突然完了する
i
ため増分されません。for
continue LABEL1
2 番目のスニペットにこれがあった場合、i
最初のスニペットと同様に (JLS に従って) 増加されることに注意してください。
将来へのヒントとして、決定的言語のルールや意味論に関する答えは、いつも言語仕様を参照してください。Javaの場合、JLS。