while文 ループ構文2

while文

C言語ではfor文のほかに、while文というループ文があります。


#include <stdio.h>

int main()
{
    int i = 0;
    while(i < 10)
    {
        printf("%d ", i);
        i++;
    }
    getchar();
}
0 1 2 3 4 5 6 7 8 9 
while(条件式){ 文 }
条件式が真の間、文を繰り返し実行する

while文で使用するのは条件式ひとつだけです。
条件式が真の間、文が繰り返し実行されます。

while文はfor文に比べると簡潔にループを書くことができます。
ただ、サンプルコードのようにループカウンタを終了条件にする場合はfor文のほうが良いでしょう。

意図的な無限ループ

while文は意図的に無限ループをさせるコードでよく用いられます。


#include <stdio.h>

int main()
{
    int count = 0;
    while (1)
    {
        if (count < 10)
        {
            printf("%d ", count);
            count++;
            continue;
        }
        break;
    }
    getchar();
}
0 1 2 3 4 5 6 7 8 9 

while文の条件判定に「1」が指定されています。
C言語の条件判定では0は偽、それ以外は真となります。
(if文#数値の条件判定を参照)
条件式に1を指定すると常に真となるので、このwhile文は無限ループとなります。

本当に無限ループにしてしまうとプログラムが終了できないので、ループ文を抜けるための処理を必ず記述します。

continue文

サンプルコードでは、変数countの値が10未満の間は変数countの値を画面に表示し、値をひとつ増やしています。
次にcontinue文を実行します。
continue文が実行されると、その行以降の処理はスキップされ、ループ文の先頭に処理を戻します。

ループにより変数countが10以上になると、if文は実行されません。
その次のbreak文により、ループ処理を抜けます。
break文はswitch文の時にも説明しましたが、現在のswitch文やループ文を抜けます。

do while文

do while文はwhile文とよく似たループ文です。

do{ 文 }while(条件式)
文を実行し、条件式が真の間、文を繰り返し実行する

do while文は、ループ終了の条件判定が最後に行われます。
条件式に関係なく、ループブロック内の処理は必ず一度は実行される点がwhile文とは異なります。

do while文は、何らかの処理が成功するまで繰り返す時によく用いられます。
以下はwhile文を使用して、「a」を含む文字が入力されるまでループを続けるサンプルコードです。


#include <stdio.h>

int main()
{
    int moji = 0;

    while (moji != 'a') {
        moji = getchar();
    }
}

このコードは動作はしますが、最初のループ時の条件判定のmoji != 'a'は偽になることは確実で、無駄な判定となっています。

これをdo while文で書き直すと以下のようになります。


#include <stdio.h>

int main()
{
    int moji = 0;

    do {
        moji = getchar();
    } while (moji != 'a');
}

「処理」→「成否判定」の順なので、while文よりもdo while文を使用するほうが自然なコードとなります。