whileを理解する
whileとdo-whileは条件を調べながら同じ処理を繰り返します。初期値、条件を調べる時点、本体の更新、終了後の値を一回ずつ追い、回数や合計を求めます。
この単元で学ぶこと
- 条件を調べる時点から実行回数を求める
- ループの更新と終了値を追う
- 条件の型と到達可能性を判定する
本文解説
条件を先に調べる int i=0;while(i<3){System.out.print(i);i++;}は012を表示します。条件を調べてから本体へ入り、更新して条件へ戻ります。i=3になった条件評価でfalseとなり終了します。最後に表示した2と終了値3は異なります。
最初から条件不成立 int i=3;while(i<3){...}は一度も本体へ入りません。事前に回数0を許容する処理に適しています。do-whileと異なり、本体の実行を経ずにループ後へ進む経路があるため、本体だけで行う初期化を保証できません。
境界条件 i<3なら0,1,2の三回、i<=3なら0,1,2,3の四回です。始点、比較記号、更新幅をまとめて確認します。i=1からi<=3なら三回であり、上限だけで回数を決められません。
合計を積み上げる int i=1,sum=0;while(i<=3){sum+=i;i++;}ではsumを0→1→3→6と更新します。sumは本体の外で初期化し、各反復で前の合計を保持します。毎回sum=0を本体へ書けば累積ではなく最後の値だけになるので位置が重要です。
更新幅と減少 i+=2なら0,2,4のように進みます。i--で減らす場合はi>0等、終了へ向かう条件を選びます。条件i>0のままi++するなど遠ざかる更新は、想定外に長く回るか桁あふれへ至ります。終了しないコードを無制限に実行して確かめないようにします。
条件内の増分 int i=0;while(i++<3){...}では比較に使うのは増分前です。最後に3<3がfalseになる評価でもiは4へ増えます。条件式を評価する回数は、本体実行回数より通常一回多いことに注意します。
空文とスコープ while(i++<3);は空文を繰り返します。後続のブロックはループの外です。また本体ブロックで宣言した変数は外で参照できません。条件式と本文の間のセミコロンや波括弧は、字下げに関係なく構造を決めます。
型と到達可能性 whileの条件はbooleanまたはBooleanです。while(1)は使えません。while(false){...}は本体が到達不能としてコンパイルエラーですが、boolean b=false;while(b){...}なら定数式でない変数なのでコンパイルでき、本体は0回です。
図解
重要ポイント
- whileは本体の前、do-whileは本体の後に条件を評価する。
- while本体は0回の場合がある。
- do-whileは到達すれば通常少なくとも一回本体を実行する。
- 条件をfalseにする更新やbreakがなければ終了しない場合がある。
間違えやすい点
- 表示される最後の値と終了時の変数を同一視しない。
- <=と<による反復回数の差を見落とさない。
- 後置増分が失敗した条件評価でも更新する点を忘れない。
用語解説
- 反復
- 同じ処理へ戻って繰り返すこと。
- 継続条件
- trueの間ループを続けるboolean式。
- ループ不変条件
- 繰返しの各段階で保たれる性質。ここでは合計や回数の確認に使う。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。