目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】

399, 2022-01-28

目次

C言語のdo-while文の使い方

C言語には複数のループ文があります。
for文、while文、そしてdo-while文です。

do-while文は他のループ文と違い、ループ判定が後判定になっています。
そのためその特性を利用したコードを書くことが可能です。

この記事ではC言語のdo-while文について詳しく解説します。

関連記事

do-while文の構造

C言語のdo-while文の構造は↓のようになっています。

do {
    処理;
    処理;
    ...
} while (判定式);

最初にdoと書き、それから波カッコ({})を書きます。
そして波カッコの中にループさせたい処理を書きます
それからwhileを書いてカッコの中にループの判定式を書きます
この判定式の結果が真のあいだ、do-while文はループを続行します。

このようにdo-while文はほかのループ文とは一風変わった構造になっています。
do-while文を実行すると最初にループの中の処理が実行されます。
そしてその後にやっとループの判定が入ります。
ループの判定が真なら再びdoまで戻り、書かれた処理を実行します。

つまりこういうことになります。

  • do {} の中に入る

  • do {} の中の処理を実行

  • while (判定式) でループ判定

  • 判定が真なら do {} の先頭に戻る

このようにdo-while文は最初に処理を実行し、ループ判定は後に実行されます

do-while文の使いどころ

do-while文の使いどころはどこでしょうか?
do-while文はループする処理を判定式より先に実行するという特徴を持ちます。

そのため適しているのは↓のようなケースです。

  • ループ判定より先に実行させたい処理がある時

ループ判定より先に実行させたい処理の例として上がるのが、パスワードの入力処理です。
パスワードの入力では最初にユーザーにパスワードを入力してもらいます。
そしてそのパスワードがOKならループを抜けて、NGならループを継続します。

このような先にユーザーの入力を求めて、それからループ判定を行うような処理では、do-while文が向いています。
つまり↓のような場合です。

  • 先に処理させたいことがある

  • その後にループするか判定したい

do-while文でカウント変数をカウントする

do-while文の実際のコードは↓になります。

#include <stdio.h>

int main(void) {
    int i = 0;

    do {
        i += 1;
    } while (i < 4);

    printf("i: %d\n", i);
    // i: 4

    return 0;
}

↑のdo-while文のコードはカウント変数をループ中でカウントするコードです。
最初にカウント変数iを定義しています。

    int i = 0;

それからdo-while文を実行します。

    do {
        i += 1;
    } while (i < 4);

do { ... }ではカウント変数iをインクリメントしています。
そしてwhile (...)の判定ではi < 4という判定式を使っています。
このループの条件はカウント変数i4より下のあいだループを継続するというものです。
i4以上になると判定式が偽になりループが終了します。

最後にカウント変数iの値を出力しています。

    printf("i: %d\n", i);
    // i: 4

このprintf()の出力結果は「i: 4」になります。
カウント変数i4以上になっていることがわかります。

do-while文で年齢入力を行う

もう1つサンプルを紹介します。
do-while文を使ってユーザーに年齢を入力してもらうコードです。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buf[100];
    int age;

    do {
        // バッファに年齢を入力
        printf("年齢を入力してください > ");
        if (!fgets(buf, sizeof buf, stdin)) {
            break;
        }

        // バッファを整数に変換
        age = atoi(buf);

    } while (age < 20);  // 20歳より下ならループ

    return 0;
}

↑のコードをコンパイルして実行すると↓のようになります。

年齢を入力してください > 17
年齢を入力してください > 18
年齢を入力してください > 19
年齢を入力してください > 20


このコードでは入力された年齢が20歳より下の場合はループを継続します。
つまり20歳より下の年齢は受け付けないという感じのコードです。
20歳より下の年齢が入力されたら何かエラーを出すというのもアリですが、誤入力の場合もあるのでこのようにループさせます。
何回かループが継続したら強制的にエラーを出すという設計もアリだと思います。

do-while文でブロックを作る

もう1つdo-while文の活用例を紹介します。
これは好む人とそうでない人にわかれますが、do-while文でブロックを作ることができます
たとえば↓のようにです。

int a = 1;
do {
    int a = 2;  // 外のaとは別の変数になる
} while (0);

while (0)になっているのでこのdo-while文はループを実行せずにすぐに終了します。
しかしC言語では変数などのスコープは波カッコ({})ごとに作られるので、このようなdo-while文を書くことでスコープを1つ作ることが可能です。

このdo-while文はただの波カッコでも代用できますが、do-while文にしたほうが視覚的にわかりやすいのでこのようなコードを好まれる人もけっこういます。

int a = 1;
{
    int a = 2;  // 外のaとは別の変数になる
}

while文との比較

do-while文と似ているwhile文と比較してみます。
まずwhile文は↓です。

while (判定式) {
    処理;
    処理;
    ...
}

do-while文は↓です。

do {
    処理;
    処理;
    ...
} while (判定式);

2つを比べると、do-while文の「処理より後に判定式」という特徴がよくわかるかと思います。
do-while文のdoは「やる」とか「やれ」とかの意味になるので、do-while文は「やれ、そして繰り返せ」という日本語にすることも可能です。
while文は「繰り返せ、やれ」になっているので2つの構造の違いがよくわかりますね。

おわりに

今回はC言語のdo-while文について解説しました。
do-while文はかゆい所に手が届くループ文になっています。
while文とセットで覚えておきましょう。

(^ _ ^)

やれ、そして繰り返せ

(・ v ・)

御意



この記事のアンケートを送信する