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

トップページ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 でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る