while・do-whileの全体像
whileは繰返しの前、do-whileは本体の後で条件を調べます。条件を変える更新がどこにあるかを確認すると、回数・合計・終了時の値を正確に追跡できます。コード断片は正しいmain内で実行します。
この単元で学ぶこと
- whileとdo-whileの条件評価順を説明できる
- 増分・break・continueを含む繰返しを追跡できる
- 終了条件と境界の誤りを検証できる
本文解説
前で調べるwhile int i=0; while(i<3){System.out.print(i); i++;}は012を表示し、終了後のiは3です。条件i<3を調べ、真なら表示、更新、次の条件という順に進みます。i=3になってから条件がfalseとなるので、最後に表示した2と終了時の3を分けます。
後で調べるdo-while int i=5; do{System.out.print(i); i++;}while(i<3);は5を一回表示し、i=6で終了します。条件が最初から満たされない値でも本体へ一度入ります。whileの後のセミコロンはdo-whileの構文に必要で、通常のwhileの直後へ不用意に置く空文とは意味が違います。
合計を順に更新する int i=1,sum=0; while(i<=3){sum+=i; i++;}ではsumは1、3、6、iは2、3、4と変化します。条件判定前・本体後・更新後の値を行ごとに表にします。<=を<へ変えると3を足さなくなるため、回数が一つずれる原因を特定できます。
増分と評価値 i++は現在値を式の値として使ってから増やし、++iは増やした値を使います。int i=0; while(i++<3){}の本体は三回ですが、最後のfalse判定でも増分するためiは4です。条件式に副作用がある場合、終了判定そのものの更新も記録します。
breakで抜ける int i=0; while(i<5){if(i==2)break; System.out.print(i); i++;}は01で終わりiは2です。breakの後の表示と増分は実行しません。ラベルなしのbreakは最も内側の対象ループ等を抜けるので、二重ループ全体が必ず終了するわけではありません。
continueで次の判定へ int i=0; while(i<3){i++; if(i==2)continue; System.out.print(i);}は13です。continueは本体の残りを省略して次の条件評価へ進みます。i++をcontinueより後へ置くと更新が省略され、同じ条件を永久に繰り返す場合があるため注意します。do-whileのcontinueも条件評価へ進みます。
終了しない経路 int i=0; while(i<3){System.out.print(i);}はiを変更しないので通常は終了しません。初心者の検証では無限に出力する例をそのまま走らせず、トレースや回数制限付きの別例で原因を確認します。外部入力が変化する繰返しでは、その更新を担う処理も確認します。
実行と検査の分担 Javaの条件はbooleanまたはBooleanです。Booleanはアンボクシングされ、nullなら実行時に例外になります。while(false){...}の本体は到達不能でコンパイルエラーとなりますが、boolean run=false; while(run){...}なら変数は定数式ではないためコンパイルでき、本体0回で終わります。コンパイル可否、表示、最後の値を別々の期待結果として検証します。
図解
重要ポイント
- whileは0回の可能性、do-whileは本体へ最低1回入る。
- 条件がfalseになった判定での副作用も数える。
- breakはループを抜け、continueは残りを飛ばす。
- 更新が全経路で実行されるかを確認する。
間違えやすい点
- 最後に表示する値と終了後の変数を混同しない。
- continueで更新を飛ばさない。
- while(false)の到達不能と変数falseで0回を区別する。
用語解説
- 前判定
- 本体の実行前に条件を評価する方式。
- 後判定
- 本体を実行してから継続条件を評価する方式。
- break
- 対象ループなどから抜ける文。
- continue
- ループ本体の残りを省略して次の継続処理へ進む文。
- 後置増分
- 式としては増加前の値を返し、変数は1増える演算。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。