while・do-whileの違いと使い分け
whileとdo-whileは条件を調べながら同じ処理を繰り返します。初期値、条件を調べる時点、本体の更新、終了後の値を一回ずつ追い、回数や合計を求めます。
この単元で学ぶこと
- 条件を調べる時点から実行回数を求める
- ループの更新と終了値を追う
- 条件の型と到達可能性を判定する
本文解説
0回を許すか比較する int n=5;while(n<5){n++;}ならnは5のままです。do{n++;}while(n<5);なら6になります。同じ条件と本体でも、最初に条件を評価するかが違います。先に入力等の処理を一回行う必要があるかを選択の基準にします。
同じ結果になる場合 i=0から3未満の間に表示して増やす処理なら、whileとdo-whileはいずれも012です。最初の条件がtrueで、途中のbreak等がなければ似た結果になります。ただし常に同じだと一般化せず、最初がfalseになる境界を試します。
条件評価回数 副作用のない通常のwhileが本体を3回実行して条件falseで終わるなら、条件は4回評価します。do-whileは本体の後で調べるため、本体3回なら条件も3回です。条件内の増分やメソッド呼出しがある場合、この違いが状態へ影響します。
前置条件内での更新 int i=0;while(++i<3){print(i);}は12を表示します。do{print(i);}while(++i<3);は012です。前者の最初の表示は条件更新後、後者は条件更新前です。比較式の形だけでなく、本体と条件の位置を時系列に並べます。
合計と更新の順序 while(i<3){sum+=i;i++;}とwhile(i<3){i++;sum+=i;}は同じ回数でも足す値が違います。i=0なら前者0+1+2=3、後者1+2+3=6です。whileかdoかの区別に加え、本体内部の文の順序も結果を左右します。
更新を飛ばす危険 whileの本体でcontinueを更新前に実行すると、条件変数が変わらず同じ経路を繰返すことがあります。doでも更新が本体にあるなら同じ危険があります。条件式自体に更新がある例ではcontinueでもその評価へ進みますが、読みやすさのため副作用を分ける設計を検討します。
初期化保証の比較 while本体でしか代入しない変数は0回経路があるため、ループ後に読めないことがあります。do本体の無条件代入は初回に実行されます。breakがその代入より前にある場合は保証できないため、構文名だけでなく実際の到達経路を調べます。
停止を確かめる カウンタが条件の境界へ近づくか、変数更新が毎回行われるかを見ます。無限ループを試す場合は制限回数や終了条件を用意し、強制終了だけに頼らないようにします。本単元の設問コードはいずれも終了するかコンパイルで拒否される形に限定しています。
図解
重要ポイント
- whileは本体の前、do-whileは本体の後に条件を評価する。
- while本体は0回の場合がある。
- do-whileは到達すれば通常少なくとも一回本体を実行する。
- 条件をfalseにする更新やbreakがなければ終了しない場合がある。
間違えやすい点
- 表示される最後の値と終了時の変数を同一視しない。
- <=と<による反復回数の差を見落とさない。
- 後置増分が失敗した条件評価でも更新する点を忘れない。
用語解説
- 反復
- 同じ処理へ戻って繰り返すこと。
- 継続条件
- trueの間ループを続けるboolean式。
- ループ不変条件
- 繰返しの各段階で保たれる性質。ここでは合計や回数の確認に使う。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。