ユーニックス総合研究所

  • home
  • archives
  • c-do-while

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

  • 作成日: 2022-01-28
  • 更新日: 2023-12-25
  • カテゴリ: C言語

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

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

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

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

関連記事

魔法の壺、プログラミングのライブラリ(Library)とは
頭悪い人にプログラミングは可能か?可能です
頭の悪い人の特徴とは?あなたはこんな時、頭が悪くなる
頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方

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文とセットで覚えておきましょう。

🦝 < やれ、そして繰り返せ

🐭 < 御意