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と同じで、型検査と実行時例外を区別します。

図解

do-whileは本体から始める
最初の本体の前には条件を評価しない。break等で抜ける場合は末尾条件を評価しない。

重要ポイント

  • whileは本体の前、do-whileは本体の後に条件を評価する。
  • while本体は0回の場合がある。
  • do-whileは到達すれば通常少なくとも一回本体を実行する。
  • 条件をfalseにする更新やbreakがなければ終了しない場合がある。

間違えやすい点

  • 表示される最後の値と終了時の変数を同一視しない。
  • <=と<による反復回数の差を見落とさない。
  • 後置増分が失敗した条件評価でも更新する点を忘れない。

用語解説

反復
同じ処理へ戻って繰り返すこと。
継続条件
trueの間ループを続けるboolean式。
ループ不変条件
繰返しの各段階で保たれる性質。ここでは合計や回数の確認に使う。

関連教材

参考資料

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

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