continueを理解する
continue文は現在の反復の残りを省略して、次の反復へ進むための制御文です。for・while・do-whileで戻る位置が異なるため、更新や条件評価が実行されるかを確認します。
この単元で学ぶこと
- continue後に移る位置を構文ごとに判断する
- 本体の省略範囲と更新を追う
- ラベル付きcontinueの対象を判定する
本文解説
一回分だけ飛ばす for(int i=0;i<4;i++){if(i==1)continue;print(i);}は023です。i=1の残りだけを飛ばし、i=2以降も続けます。breakなら0だけで終了するため、不要な要素を除外するのか検索全体を終えるのかで使い分けます。
forの更新へ進む continueはforの更新式i++を省略しません。i=1の反復でcontinueしてもi=2へ進みます。もし更新を本体末尾に書いたfor(;i<4;){...;i++;}なら、その更新文はcontinueで飛ばされる場合があります。構文上の位置を確認します。
whileでは条件へ戻る while(i<4){i++;if(i==2)continue;...}なら更新後にcontinueするため進み続けます。更新前にcontinueすると同じiで条件へ戻る可能性があります。無限に回る疑いのあるコードはそのまま実行せず、状態を表にして確認します。
doでは末尾条件へ do{...;continue;}while(condition);では条件を評価します。条件に++があればそれも実行します。breakは条件を評価せず終了するため、同じ位置の制御文を置き換えても結果が同じとは限りません。
入れ子の対象 内側ループのcontinueは通常その内側の次の反復へ進みます。外側本体を直接飛ばすわけではありません。outer:for(...){for(...){continue outer;}}とすれば、外側の更新と次回条件へ進み、内側の残りと外側本体の残りを省略します。
switch内からのcontinue ループ内のswitchでcontinueを使うと、対象はswitchではなく周囲のループです。switchはcontinue先にはなれません。switchだけしかない場所でcontinueを書くとコンパイルエラーです。breakと同じ対象探索ではない点を押さえます。
ラベルはループを指す outer:{continue outer;}はラベル付きブロックですがcontinue先として不正です。break outerならブロックを抜けられても、continueは次の反復があるループを必要とします。ラベル名が存在するだけでは十分ではありません。
到達可能性 continue;の直後に同じブロックでprintを書くと到達不能です。if条件内にcontinueを書いた場合は、不成立の経路から後続文へ進めるため合法になり得ます。飛ばすことが確定しているかを構文の経路で判断します。
図解
重要ポイント
- continueはループを終了しない。
- forでは更新式へ、whileでは条件へ、doでは末尾条件へ進む。
- ラベルなしcontinueは最も内側のループが対象。
- continueのラベルはループを指していなければならない。
間違えやすい点
- forの更新式をcontinueが飛ばすと思わない。
- while本体の更新をcontinueで飛ばして停止しなくなる構造に注意する。
- switchをcontinueの対象と考えない。
用語解説
- continue
- 現在の反復を打ち切り、対象ループの継続処理へ進む文。
- 更新式
- 基本for文の三つ目の欄。通常完了またはcontinue後に評価される。
- 反復の省略
- 一回分の残りだけを飛ばすこと。ループ全体を終了することとは違う。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。