5-2 while文(ループ)

同じ処理の繰り返しが必要な場合に使用します。
for文の他にwhile文がありますので、ここではwhile文の使い方を説明します。

while文

while文の書き方は以下となります。

while (条件式)
  実行する処理;

(条件式)
条件式が「真」ならば「実行する処理」を実行します。

サンプルを見てみましょう。

int i=0;
while (i<3){
  printf("%d 回目です\n",i);
  i++;
}

説明します。

(条件式)
i<3 の場合には、「実行する処理」である printf文とi++を実行します。
i=3 の場合には、printf文とi++は実行されません。

以下が実行結果です。

#include <stdio.h>

int main()
{
    int i=0;

    while (i<3) {
        printf("%d 回目のループです\n", i);
        i++;
    }
}
実行結果
0回目のループです
1回目のループです
2回目のループです

次の例は複数の文を実行する例です。

#include <stdio.h>

int main()
{
    int i=0;

    while (i<3) {
        printf("%d 回目のループです\n", i);
        printf("i+1 は %d です\n", i+1);
        i++;
    }
}
実行結果
0 回目のループです
i+1 は 1 です
1 回目のループです
i+1 は 2 です
2 回目のループです
i+1 は 3 です

下のような書き方になります。

while (条件式){
  実行する処理;
  実行する処理;
  実行する処理;
}

while文2重ループ

2重ループの使い方です。3重、4重も同様です。

#include <stdio.h>

int main()
{
    int x=1, y=10;

    while (x<=3) {
        while (y<=30) {
            printf("x=%d y=%d x+y=%d\n", x, y, x+y);
            x+=1;
            y+=10;
        }
    }
}
実行結果
x=1 y=10 x+y=11
x=2 y=20 x+y=22
x=3 y=30 x+y=33

while文無限ループ

無限ループの使い方は以下の書き方です。

while (1) {
    実行する処理;
}

条件式に1と書いてありますが、数値だけでも式です。
そして、1は真を表しますので、これは常に真なので無限ループとなります。
このままではプログラムが永遠に終了しないため、次に説明するbreakによって終了させます。

break文

break文はwhile文の実行を中止します。

#include <stdio.h>

int main()
{
    int i=0;

    while (1) {
        i++;
        if (i>=3) {
            printf("終了します\n");
            break;
        }
        printf("while %d回目の処理\n", i);
    }
    printf("処理が終了しました\n");
}
実行結果
while 1回目の処理
while 2回目の処理
終了します
処理が終了しました

この使い方は、while文を実行する時点では終了条件が分からない場合です。
while文内で何らかの処理を行ったときに、終了条件が判明したらbreakで終了するということです。
上の例では、 i>=3 で break して、while文を抜け出ます。
while 3回目の処理」が無いことに注意してください。

continue文

continue文は処理をスキップします。
次の例を見てください。

#include <stdio.h>

int main()
{
    int i=0;

    while (i<5) {
        i++;
        printf("i while文の下 i=%d です\n", i);
        if (i<2) {
            /* 処理が不要のためスキップ */
            printf("continue文の前です\n");
            continue;
        }
        printf("if文の下 i=%d です\n", i);
    }
    printf("処理が終了しました\n");
}
実行結果
i while文の下 i=1 です
continue文の前です
i while文の下 i=2 です
if文の下 i=2 です
i while文の下 i=3 です
if文の下 i=3 です
i while文の下 i=4 です
if文の下 i=4 です
i while文の下 i=5 です
if文の下 i=5 です
処理が終了しました

この使い方は、while文の中で処理したくない、処理をスキップしたいという場合に
continue文を使ってスキップします。
上記の例では、iが2未満のときには、
「printf("if文の下 i=%d です\n", i)」
の処理をしないということです。
continue文を実行すると、continue文の下方の文は処理をせずにwhile文のすぐ下の行に行きます。
実行結果の出力をみてください。
if文の下 i=2 です
i=1の場合はこのprintfが無いことに注意してください。
スキップされています。

次の例を見てください。
2重ループの場合です。
この場合 continue するとどこに行くのでしょう。

#include <stdio.h>

int main()
{
    int i=0, k=0;

    while (k<2) {
        k++;
        printf("k while文の下 k=%d です\n", k);
        while (i<4) {
            i++;
            printf("i while文の下 i=%d です\n", i);
            if (i<2) {
                /* 処理が不要のためスキップ */
                printf("continue文の前です\n");
                continue;
            }
            printf("if文の下 i=%d です\n", i);
        }
        printf("処理が終了しました\n");
    }
}
実行結果
k while文の下 k=1 です
i while文の下 i=1 です
continue文の前です
i while文の下 i=2 です
if文の下 i=2 です
i while文の下 i=3 です
if文の下 i=3 です
i while文の下 i=4 です
if文の下 i=4 です
処理が終了しました
k while文の下 k=2 です
処理が終了しました

continue を実行すると「i while文の下 i=2 です」に行きます。
2重ループの場合の continue は、自分の属している {} のwhile文に戻ります。
break も同様です。

do while文

do while文の書き方は以下となります。

do {
    実行する処理;
} while (条件式);

(条件式)
条件式が「真」ならば「実行する処理」を実行します。

サンプルを見てみましょう。

int i=0;
do {
        printf("%d 回目です\n", i); ←文1
        i++; ←文2
} while (i<3);

説明します。

文1を実行します。
文2を実行します。
条件式(i<3)が「真」かどうか調べます。
真なら文1に戻ります。
偽ならwhileを終了して次の処理へ進みます。

以下が実行結果です。

#include <stdio.h>

int main()
{
    int i=0;

    do {
        printf("%d 回目です\n", i);
        i++;
    } while (i<3);
    printf("while終了です\n", i);
}
実行結果
0 回目です
1 回目です
2 回目です
while終了です

次の例は複数の文を実行する例です。

#include <stdio.h>

int main()
{
    int i=0;

    while (i<3) {
        printf("%d 回目のループです\n", i);
        printf("i+1 は %d です\n", i+1);
        i++;
    }
}
実行結果
0 回目のループです
i+1 は 1 です
1 回目のループです
i+1 は 2 です
2 回目のループです
i+1 は 3 です

while文と違うのは、判断を最初に行うか、判断を最後に行うかです。
continueやbreakの使い方もすべて同じです。

コメント

タイトルとURLをコピーしました