Javaの代表的な反復処理にはfor文とwhile文がありますが、whileと似た反復処理にdo-while文という構文もあります。
今回はdo-whileの文法やwhileとの違いについて解説します。
do-whileの文法
do-whileとwhileの違いは、「必ず一度処理を行うかどうか」です。
while文は条件に合致しなかった場合は一度も処理を行わないこともありますが、一度必ず処理を行いたい場合にはdo-whileを記述します。
do-whileもwhileと同様に条件に合致する(true)の時に反復処理を行います。
処理はdoブロックである{}内に記述します。
ブロックを記述しない方法もあり、その際はdoからwhile間の1行のみが繰り返し処理の適用範囲になります。
do-whileの文法 (ブロック記述) |
do{
繰り返したい処理 ; }while( 条件 ); |
---|---|
記述例 | int count = 1;
do{ System.out.println(count); count++; }while(count <= 100); |
do-whileの文法 | do
繰り返したい処理 ; while( 条件 ) ; |
記述例 | int count = 1;
do System.out.println(count++); while(count <= 100 ); |
記述例の補足
記述例はcountが100になるまでループを行うプログラミングとなっています。whileは条件を確認し、条件に合致している場合にループ処理を行います。do-whileはwhileと違い、do(もしくはdoブロック)の部分を実行して後に条件を確認します。
do-whileの使いどころ
do-whileは「必ず一度処理を行う」プログラムの流れで利用するとすっきりしたコードが書けます。
以下のdo-whileで記述したサンプルプログラムを記述してみましょう。
do-while文 サンプルプログラム
以下のプログラムを「Number18.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Number18{ public static void main(String[] args){ //変数内に格納されている数値の桁を確認するwhile int number = 10000; //数値 int digit = 0; //桁 do{ number = number / 10; digit++; }while(number > 0); System.out.println("数値は" + digit + "桁ありました"); } } |
実行例
C:\work>javac Number18.java
C:\work>java Number18
数値は5桁ありました
※実行例はコンパイルから実行までの例を表示しています。
Number18.javaの補足説明
サンプルプログラムは数値の桁を調べるためのループ処理を記述しています。
用意されている変数は2つです。
- 変数numberには、桁を調べたい数値を格納(初期値10000)
- 変数digitには、調べた桁を格納(初期値0)
また、桁を調べる際に以下の2つの処理を行います。
- 数値の桁を調べるために「数値を10で割る」処理
- 処理を行った場合は桁(digit)をインクリメント
上記の2つの処理を行った後、数値が0より大きい場合は、処理を繰り返します。
以下の表はループ処理の内容と変数内のデータです。
順序 | 実行内容 | 補足 |
---|---|---|
1 | 桁を調べる処理 | 実行後のデータ
number:1000 |
2 | number(1000) > 0 | 評価:true |
3 | 桁を調べる処理 | 実行後のデータ
number:100 |
4 | number(100) > 0 | 評価:true |
5 | 桁を調べる処理 | 実行後のデータ
number:10 |
6 | number(10) > 0 | 評価:true |
7 | 桁を調べる処理 | 実行後のデータ
number:1 |
8 | number(1) > 0 | 評価:true |
9 | 桁を調べる処理 | 実行後のデータ
number:0 |
10 | number(0) > 0 | 評価:false |
上記のdo-whileをwhileに置き換えると以下のようになります。
1 2 3 4 5 6 7 |
number = number / 10; digit++; while(number > 0){ number = number / 10; digit++; } |
whileの上にwhile内部と同じような処理が増えています。この処理はnumberが0の時に0桁になってしまうのを防ぐためです。
(条件を変更する等の他の対処もあります)
while文に慣れてきたら、do-whileに置き換えることができるか考えてみましょう。(必ず置き換える必要はないと思いますが)
まとめ
- whileでは条件に合致した場合に反復処理を行うため、1度も実行されない場合もある
- do-whileは必ず1度は処理が実行される