【連載13】Javaプログラミングの基本 繰り返し(while文)

基本制御構造の一つである「繰り返し」。

「繰り返し」は、前回見てきたfor文だけでなく、while文という制御構文を使うことでも実現できます。

今回の記事では、そのwhile文について解説していきます。

while文の使い方

while文は指定した条件式が真(true)となる間、処理を繰り返します。

while文の構文は以下のとおりです。

while( 条件式 ){
  // 繰り返しの中で実行される処理
  …
}

while文は、条件式が真である間、whileブロック内の処理を繰り返します。

下記の例では、cnt変数の値が10よりも小さい間、whileブロックの中身が実行されます。

public class Sample13_01{
    public static void main(String[] args) {
        int cnt = 0;
        int sum = 0;
        
        while(cnt < 10){
            sum += cnt;
            cnt++;        //カウンタ変数インクリメント
        }

        System.out.println("0から9までの総和は " + sum + " です。");
    }
}
0から9までの総和は 45 です。

while文はfor文と違い、while文の構文として変化式のようなものを指定できません。つまり、カウンタ変数(ループ変数)をインクリメントする機能を備えていません。

ですので、指定した回数で繰り返したい場合は、whileブロック内でカウンタ変数をインクリメントしてやる必要があります。

do while文の使い方

「繰り返し」はdo while文という制御構文を使うことでも実現できます。

do{
  // 繰り返しの中で実行される処理
  …
}while( 条件式 )

do while文の条件式判定が偽であっても、最低1回は処理を実行するという点が特徴です。

do while文のサンプルコードを下記します。

public class Sample13_02{
    public static void main(String[] args) {
        int cnt = 0;
        
        do {
            System.out.println(cnt);
            cnt++;
        }while (cnt < 10);
    }
}
0
1
2
3
4
5
6
7
8
9

また、上記したとおり、do while文はループに入るとき条件式の判定が偽であっても最低1回はブロック内の処理を実行します。

例えば、上記サンプルコードを下記のように変更した場合、

int cnt = 10;

do {
    System.out.println(cnt);
    cnt++;
}while (cnt < 10);
10

do whileブロックに入った時点で、変数cntの値は10となっており、条件式の判定は偽となりますが、「System.out.println(cnt);」ステートメントが実行されていることがわかります。

このような、ループ内の処理を行ってから条件式を判定する方式を後判定ループと言います。

それに対し、while文やfor文のようにループ内の処理を行う前に条件式を判定する方式を前判定ループと言います。

do while文もwhile文同様、doブロック内でループ変数をインクリメントさせてやらなければなりません。

この処理を忘れると、条件式が永遠に真のままとなり、ループを抜けることができなくなります。ずーっと同じ処理を繰り返し、いつまで経ってもプログラムが終了しない、そのような状態のことを俗に無限ループと呼ばれます。

無限ループはソフトウェア開発において、代表的な不具合の一つとなっており、十分に注意が必要です。

まとめ

今回は、繰り返し処理を実現する制御構文のひとつであるwhile文について見てきました。

同じことができる制御構文としてfor文がありますが、for文の場合は、条件式の他に、forブロック内で使用する変数の初期化や変化式を記述することができます。

一方でwhile文は条件式のみの記述となります。

そのため、while文に入る前であったり、while文の中で初期化や変化式に相当することを記述してやる必要があります。

その特徴を踏まえ、どちらの構文で記述した方がソースコードの可読性(読みやすさ)を高めることができるのか、その点を意識して使い分けられるようになっていくのが良いです。