do-whileを理解する
whileとdo-whileは条件を調べながら同じ処理を繰り返します。初期値、条件を調べる時点、本体の更新、終了後の値を一回ずつ追い、回数や合計を求めます。
この単元で学ぶこと
- 条件を調べる時点から実行回数を求める
- ループの更新と終了値を追う
- 条件の型と到達可能性を判定する
本文解説
本体を先に実行する int i=0;do{System.out.print(i);i++;}while(i<3);は012です。doの本体を実行してから条件を調べます。whileと違って到達時に条件を先に調べないため、最初から条件がfalse相当でも本体を一回実行します。
末尾のセミコロン do{...}while(condition);には末尾セミコロンが必要です。while(condition){...}の前置形式とは文法が違います。doの後ろは一つの文でもブロックでもよく、do i++;while(i<3);のような形式も可能です。
一回だけの実行 do{...}while(false);は本体を一回行って終了する合法な文です。while(false){...}と異なり本体へ到達できるためコンパイルできます。初期化や確認処理を必ず一度行う構造として理解します。
終了時の値 int i=3;do{i++;}while(i<3);では本体を一回実行してi=4になり終了します。初期条件から0回とするwhileの結果3とは異なります。比較対象は本体の更新を済ませた後の値です。
条件に副作用がある場合 int i=0;do{print(i);}while(i++<2);は012を表示し、最後の条件でiが3となります。最初の本体は条件内の増分より前です。前置++iなら最初0を表示した後1へ増え、次の本体1の後2へ増えて終了します。
初期化の保証 int x;do{x=7;}while(false);の後ではxを読めます。本体が必ず代入するからです。ただし本体内のifが条件付き代入なら保証は崩れます。doはどんな代入でも必ず実行されるという意味ではなく、本体へ入ることを保証します。
breakによる条件の省略 do{break;}while(condition);はbreakでループを抜けるため末尾の条件を評価しません。条件に++があっても実行されません。continueは同じではなく、末尾の条件へ進み、条件trueなら次の本体へ入ります。
条件とスコープ do{int x=1;}while(x<3);はxのスコープが本体の波括弧内で終わるため不正です。条件でも使うカウンタは外で宣言します。booleanでない条件やnullのBooleanの扱いはwhileと同じで、型検査と実行時例外を区別します。
図解
重要ポイント
- whileは本体の前、do-whileは本体の後に条件を評価する。
- while本体は0回の場合がある。
- do-whileは到達すれば通常少なくとも一回本体を実行する。
- 条件をfalseにする更新やbreakがなければ終了しない場合がある。
間違えやすい点
- 表示される最後の値と終了時の変数を同一視しない。
- <=と<による反復回数の差を見落とさない。
- 後置増分が失敗した条件評価でも更新する点を忘れない。
用語解説
- 反復
- 同じ処理へ戻って繰り返すこと。
- 継続条件
- trueの間ループを続けるboolean式。
- ループ不変条件
- 繰返しの各段階で保たれる性質。ここでは合計や回数の確認に使う。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。