🔀 制御構造
🎯 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 の罠です)。今はひとまず、戻り値を見て抜ける形にしておきます。
罠を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 は本体を必ず1回実行してから条件を見る。末尾にセミコロンが要る。条件は「続ける条件」——入力チェックなら「範囲外なら続ける」。
do { … } while (条件); は本体を必ず1回実行してから条件を確かめる処理を1回実行してから条件を判定する繰り返し構文のこと。「必ず最低1回は実行したい」場面、とくに入力チェックで重宝される。「まず1回実行してから条件を見る」という順序が、while文との違いになる。
条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。
キーボードからの入力を読み取り、変数に格納する標準ライブラリの関数のこと。変数の前に&を付け忘れるミスが定番の罠として知られる。戻り値として、正しく読み取れた個数が返ってくる点も覚えておくとよい。
真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。
終了条件が満たされることなく、永遠に繰り返され続けてしまうループのこと。意図的に使う場合もあるが、多くはバグとして発生する。for(;;)やwhile(1)のように、あえて意図的に書かれることもある。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。