先頭へ戻る

while文 | Programming Place Plus C言語編 第16章

Programming Place Plus トップページC言語編

先頭へ戻る

このページの概要

以下は目次です。


while文

第14章では、条件に応じて処理を分岐させる方法を学びました。今度は、条件に応じて処理を繰り返す方法を学習します。つまり、ループ構造です。

ループ構造を構築する方法として、すでに for文が登場しています(第12章を参照)。実のところ、このページで取り上げる内容はすべて、for文でも実現できます。ただ、for文は少し多機能すぎる面があります。

たとえば、for文は、変数 i のような、ループの周回とともに変化する変数がセットになるのが普通です。必要がなければ省略すればいいとはいえ、それはそれで少し不自然にみえます。

// 変数 i がセット
for (int i = 0; i < 5; ++i) {}

// いらなければ書かなければいいのだが、不格好
for ( ; value == 0; ) {}

基本的に for文は、「ある回数だけ繰り返す」というループ構造の構築に向いています。一方で、回数が明確でなく「ある条件を満たすあいだ繰り返す」というループ構造には向いていない場合があります。

そこで、「ある条件を満たすあいだ繰り返す」ループをつくる方法として while文 (while statement) があります。while文の文法は次のようになっています。

while (条件式)
    繰り返したい文

要は、for文の「条件式」だけを残したものです。「条件式」を評価した結果が 0以外である間、ループします。「繰り返したい文」に書ける文は1つだけですが、ブロック文にすれば複数の文が書ける点もこれまでどおりです。

while文が作り出すコードのかたちは if文とよく似ています。if文なら、「条件式」が 0以外だったら文を1回だけ実行する。while文なら、「条件式」が 0以外であるあいだ、文を繰り返し実行する。ということになります。

// 変数 value の値が 0 のあいだ、ループする
while (value == 0) {
    // ここを繰り返す
}

// 変数 value の値が 0 のときにだけ、文を1回だけ実行する
if (value == 0) {
    // ここを1回実行する
}

次のプログラムは、入力された整数をそのまま出力することを繰り返します。負数が入力されたら、プログラムを終了します。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main(void)
{
    int value = 0;
    while (value >= 0) {
        puts("Please enter the your integer.");
        value = get_input_integer();
        printf("%d\n", value);
    }
}

実行結果:

Please enter the your integer.
10  <-- 入力された内容
10
Please enter the your integer.
5  <-- 入力された内容
5
Please enter the your integer.
-1  <-- 入力された内容
-1

do文

続いて、do文 (do statement) を取り上げます。

do文は、while キーワードとセットにすることで、特殊なかたちのループ構造を構築します。セットなので、よく「do-whileループ」という表現がなされます。

do文の構文は次のようになります。

do
    繰り返したい文
while (条件式);

do文によるループ構造が特殊なのは、「条件式」の判定をループの末尾で行う点です。そのため、「繰り返したい文」は必ず1回以上実行されます

いつものように、「繰り返したい文」は1文だけしか書けませんが、{} で囲ってブロック文にすれば、複数の文を書けます。

while文のときに例に挙げたプログラムを do文で書くと、次のようになります。

#include <stdio.h>

// 整数の入力を受け取る
// 戻り値: 標準入力から整数の入力を受け取り、その値を返す。
int get_input_integer(void)
{
    char s[40];
    fgets(s, sizeof(s), stdin);
    int value;
    sscanf(s, "%d", &value);
    return value;
}

int main()
{
    int value;
    do {
        puts("Please enter the your integer.");
        value = get_input_integer();
        printf("%d\n", value);
    } while (value >= 0);
}

実行結果:

Please enter the your integer.
10  <-- 入力された内容
10
Please enter the your integer.
5  <-- 入力された内容
5
Please enter the your integer.
-1  <-- 入力された内容
-1

プログラムの実行中、do文のところに来ると、そのまま無条件で「繰り返したい文」の実行に入ります。そして、「繰り返したい文」の終わりまで実行を終えたら、「条件式」がチェックされます。条件式を評価した結果が 0以外であれば、ループは続行となり「繰り返したい文」の先頭に戻ります。0 であれば、ループは終了です。

変数value は do文の外側で宣言しなければなりません。「繰り返したい文」の中で宣言すると、「条件式」のところで value を使えないためです。

do文はあまり使われることはありません。「必ず1回は実行される」という特徴を有効に活かせる場面がそれほどないからです。while文や for文で書けるループを、わざわざ do文で書く意味はありません。

do文が適しているように思える場面でも、while文や for文で無限ループ(第17章)をつくり、break文(第17章)を使ってループを終えるようにするとうまく書ける場合があります。


練習問題

問題① 標準入力から入力された整数分だけ、‘*’ を出力するプログラムを while文を使って作成してください。

問題② 標準入力から5の倍数の整数を入力させるプログラムを、while文を使って作成してください。5の倍数でない値が入力された場合、何度でも再入力を促すようにしてください。

問題③ 問題②のプログラムを do文を使って書き換えてください。

問題④ 次の while文はどういう意味ですか?

while (0) {
    // なんらかの処理
}


解答ページはこちら

参考リンク


更新履歴



前の章へ (第15章 論理演算)

次の章へ (第17章 処理の流れを制御する)

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー