C言語学習ポータル(無料版) 学習コンテンツ 制御構造 do-while文と入力チェック

🔀 制御構造

do-while文と入力チェック

無料公開版に収録・読む目安 10分

🎯 do-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける

アンケートを取ります。「まず1回は必ず質問する。答えが変だったら、もう一度聞く」。while だと「聞く前に条件を確かめる」ことになって、少し不自然です。こういうときはdo-while文が素直に書けます。

do {
    処理
} while (継続条件);   // ← セミコロンを忘れずに

whileとの違いは1点だけ。条件を確かめるのが後なので、条件が最初から偽でも本体は必ず1回は実行されます。「とりあえずやってみて、駄目ならもう一度」という形です。

入力チェックで使ってみましょう。

#include <stdio.h>

int main(void) {
    int n;

    do {
        printf("1〜10の数を入力: ");
        if (scanf("%d", &n) != 1) {   // 数字以外が入力された
            printf("数字を入れてください\n");
            return 1;
        }
    } while (n < 1 || n > 10);

    printf("%d を受け付けました\n", n);
    return 0;
}

「範囲外なら、もう一度聞く」がそのまま条件になっています。

注目してほしいのが scanf の戻り値をチェックしている点です。scanfは「読み取りに成功した項目の数」を返すので、%d が1つなら成功時は 1 が返ります。!= 1 なら数字ではなかった、と判定できます。ここで抜けずに聞き直そうとすると、読めなかった文字が入力に残ったままなので、同じ失敗を延々と繰り返す無限ループになります(第4トラックで見た scanf の罠です)。今はひとまず、戻り値を見て抜ける形にしておきます。

ビット「まず1回やってから考える」が do-while。入力のやり直しはこれが一番素直に書けるよ

罠を2つ。

その1、末尾のセミコロン。 } while (条件); の ; を忘れるとコンパイルエラーになります。これは即座に怒られるので、まだ親切な部類です。

その2、条件の向き。 これが本命です。while に書くのは「続ける条件」であって、「やめる条件」ではありません。「1〜10なら受け付ける」と考えて while (n >= 1 && n <= 10); と書いてしまうと、意味が完全に裏返ります。

    // 間違い: 正しい値を入れるほど聞き直される
    do {
        printf("1〜10の数を入力: ");
        scanf("%d", &n);
    } while (n >= 1 && n <= 10);

5 を入れると「範囲内だから続ける」となって何度も聞かれ、99 を入れた瞬間に抜けてしまう。チェックの意味が消えています。書いたら「どういうときに、もう一度聞きたいのか」を日本語で言い直して、そのまま条件に翻訳してください。「範囲外なら、もう一度」→ n < 1 || n > 10 です。

師範do-while の条件は「続ける」条件じゃ。「やめる」条件を書けば、世界が裏返る

まとめます。do-while は本体を必ず1回実行してから条件を見る。末尾にセミコロンが要る。条件は「続ける条件」——入力チェックなら「範囲外なら続ける」。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

do-while文どぅわいるぶん

処理を1回実行してから条件を判定する繰り返し構文のこと。「必ず最低1回は実行したい」場面、とくに入力チェックで重宝される。「まず1回実行してから条件を見る」という順序が、while文との違いになる。

while文わいるぶん

条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。

scanfすきゃんえふ

キーボードからの入力を読み取り、変数に格納する標準ライブラリの関数のこと。変数の前に&を付け忘れるミスが定番の罠として知られる。戻り値として、正しく読み取れた個数が返ってくる点も覚えておくとよい。

条件式じょうけんしき

真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。

無限ループむげんるーぷ

終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ while文——条件が決める繰り返し breakとcontinueの使いどころ ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH