do-while文

7.4 do-while文

 前節で説明したwhile文と非常によく似た構文に、do-while文があります。
 本項ではdo-while文の構文と使い方について学習していきます。

7.4.1 do-while文の基本構文

 while文では、繰り返し処理の最初の条件が成立しなかった場合、一度もブロック内の処理が行なわれません。
 一方do-while文では、まず内部処理を実行してから条件式を評価し、条件が成立する場合はループを繰り返します。そのため、必ず一度はブロック内の処理が実行されます。do-while文はwhile文とは異なり、条件式の評価タイミングが後になるのです。

 上のdo-while文の基本構文を見てわかるように、繰り返し処理を行った後に条件式の判定を行います。また、記述の注意点として、構文で条件式の後に「;(セミコロン)」が付くので忘れないようにしてください。
 do-while文をフローチャートで表すと、図 7.4.1のようになります。

図 7.4.1 : do-while文のフローチャート


7.4.2 do-while文を用いて同じメッセージを繰り返すプログラム

 では、do-while文を使って、コンソールウィンドウに同じメッセージを複数回出すプログラムを作成し、結果を確認しましょう。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :DoWhileLoop1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ DoWhileLoop1.java

package jp.co.f1.intro.ch7;

public class DoWhileLoop1 {

	public static void main(String[] args) {

		// do-while文を制御するための変数
		int i = 1;

		do {
			System.out.println("HelloDoWhileLoop!");
			i++;

		} while (i <= 5);
	}
}

実行結果

解説

 このプログラムは、do-while文を使って「HelloDoWhileLoop!」というメッセージをコンソールウィンドウに5回表示させるものです。
 8行目の記述はカウンタ変数の宣言と初期化です。while文と同じようにカウンタ変数を作成しておきます。
   8: int i = 1;

10~14行目がdo-while文です。for文やwhile文と違い、条件式を判定するタイミングが内部処理の後なので、for文やwhile文とはループを抜けるタイミングが違います。
   10: do {
   11:  System.out.println("HelloDoWhileLoop!");
   12:  i++;
   14: } while (i <= 5);

 次の表は、このプログラムのdo-while文の流れを表したものです。まず初めに内部処理である「HelloDoWhileLoop!」というメッセージの表示を行った後にインクリメントが行われ、ループの最後に条件式が判定されます。

 このプログラムをフローチャートで表すと、図 7.4.2のようになります。

図 7.4.2 : DoWhileLoop1のフローチャート


7.4.3 条件式が最初から成立しない繰り返し文を用いたプログラム

 条件式が成立しない場合に、while文とdo-while文での処理がどのように違うかを、プログラムを作成して確認しましょう。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :DoWhileLoop2
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ DoWhileLoop2.java

package jp.co.f1.intro.ch7;

public class DoWhileLoop2 {

	public static void main(String[] args) {

		// whileとdo-whileを制御するための変数
		int j = 6;

		System.out.println("-- 最初から条件に合わない場合(while文) --");

		while (j <= 5) {
			System.out.println("HelloDoWhileLoop!");
			j++;
		}

		System.out.println();
		System.out.println("-- 最初から条件に合わない場合(do-while文) --");

		do {
			System.out.println("HelloDoWhileLoop!");
			j++;
		} while (j <= 5);

	}

}

実行結果

解説

 このプログラムには、while文とdo-while文が記述されていますが、どちらも1回目の条件式が成立しないようになっています。while文とdo-while文の処理の違いを確認していきましょう。
 まず8行目では、while文とdo-while文で使うカウンタ変数を宣言し、初期化しています。    8: int j = 6;

 次にwhile文の動きですが、これは、最初から条件が満たされない記述になっています。8行目であらかじめ作成したカウンタ変数を使うと、13行目の条件式は「6 <= 5」となるので成立しません。そのため14、15行目の内部処理は実行されず、そのままwhile文から抜けます。
   12: while (j <= 5) {
   13:  System.out.println("HelloDoWhileLoop!");
   14:  j++;
   15: }

 12~15行目のwhile文の処理の動きは以下の表のようになります。


 続いて、20~23行目のdo-while文の処理の流れを解説します。先ほどのwhile文と同じように最初から条件が満たされませんが、条件式の判定の前に22、23行目の内部処理が行われます。そのため、条件式の結果に関係なく1回目のループでは内部処理である22行目の「HelloDoWhileLoop!」と23行目の変数jのインクリメントが実行されます。
 内部処理が終了すると、24行目で条件式の判定が行われます。変数jの値は7なので、条件式は成立せず、do-while文を抜けます。
   20: do {
   21:  System.out.println("HelloDoWhileLoop!");
   22:  j++;
   23: } while (j <= 5);

 次の表は20~23行目のdo-while文の処理の流れを示しています。ソースコードを見比べながら、どのような順序で実行されるのかを確認して下さい。


do – while文の使用頻度

 do – while文とwhile文の違いは、処理の後で条件の判定を行うか前に判定を行うかです。現実的には、ほとんどの場合でwhile文だけで表現できることが多いので、do – while文を使う機会はあまりないかもしれません。

 今回作成したプログラムをフローチャートで表すと、図 7.4.3のようになります。

図 7.4.3 : DoWhileLoop2のフローチャート


ポイント

 ・ do-while文は条件式に関係なく、必ず一度はブロック文内の処理が実行される。
 ・ do-while文は、条件式の判定の順番がfor文やwhile文とは異なるので、同じ式を設定していてもfor文やwhile文とは繰り返し回数が異なる場合がある。


NEXT>> 7.5 多重ループ