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の欄へ書くかで、省略されるかが変わる。

重要ポイント

  • continueはループを終了しない。
  • forでは更新式へ、whileでは条件へ、doでは末尾条件へ進む。
  • ラベルなしcontinueは最も内側のループが対象。
  • continueのラベルはループを指していなければならない。

間違えやすい点

  • forの更新式をcontinueが飛ばすと思わない。
  • while本体の更新をcontinueで飛ばして停止しなくなる構造に注意する。
  • switchをcontinueの対象と考えない。

用語解説

continue
現在の反復を打ち切り、対象ループの継続処理へ進む文。
更新式
基本for文の三つ目の欄。通常完了またはcontinue後に評価される。
反復の省略
一回分の残りだけを飛ばすこと。ループ全体を終了することとは違う。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。