【C言語入門】条件で繰り返すwhileループ!do-whileとの違いも解説

C言語の繰り返し処理といえば for ループが代表的ですが、「繰り返す回数が決まっていない」場合には while ループが非常に役立ちます。例えば、「ユーザーが特定の文字を入力するまで」や「ファイルの終端に達するまで」といった処理に最適です。

この記事では、while ループの基本的な使い方から、よく使われる実践的なパターン、そして do-while ループとの違いまでを分かりやすく解説します。


目次

while ループの基本

while ループは、指定された条件式が真(true)である間、ブロック {} 内の処理を繰り返し実行します。

基本構文:

while (条件式) {
    // 条件式が真の間、繰り返される処理
}

ループに入る前にまず条件式が評価され、真であれば処理が実行されます。処理が一通り終わると、再び条件式が評価され…という流れを、条件式が偽(false)になるまで続けます。

サンプルコード

0から4までの数値を表示するプログラムです。for ループでも書けますが、while の仕組みを理解するのに最適な例です。

#include <stdio.h>

int main(void) {
    int count = 0;

    // countが5未満の間、ループを続ける
    while (count < 5) {
        printf("%d\n", count);
        count++; // countを1増やす(この行がないと無限ループになる)
    }

    printf("ループが終了しました。\n");
    return 0;
}

count++ で毎回値を更新し、いずれ count < 5 が偽になるようにすることが重要です。


無限ループと break

while(1) のように、条件式に常に真となる値を指定すると、無限ループを作ることができます。これは、ゲームのメインループや、ユーザーの入力を待ち続けるプログラムなどで意図的に使われます。

無限ループから脱出するには、break 文を使います。

サンプルコード:Enterキーが押されるまで入力を表示する

#include <stdio.h>

int main(void) {
    int ch; // getcharの戻り値(EOF)を考慮し、int型で受け取る

    printf("文字を入力してください (Enterで終了):\n");

    while (1) { // 無限ループ
        ch = getchar();

        // Enterキー(改行文字)が押されたらループを抜ける
        if (ch == '\n') {
            break;
        }

        printf("%c", (char)ch);
    }

    printf("\n終了しました。\n");
    return 0;
}

注意: getchar() が返す値には、ファイルの終端を示す特別な値 EOF (End of File) があります。EOFchar型の範囲外にあるため、getchar()の戻り値を受け取る変数はint型で宣言するのが安全な作法です。


do-while ループ:最低1回は実行したいときに

do-while ループは while とよく似ていますが、条件式の評価をループ処理の後に行うという決定的な違いがあります。

これにより、ループ内の処理が最低でも1回は必ず実行されることが保証されます。

基本構文:

do {
    // 最低1回は実行される処理
} while (条件式); // セミコロンを忘れない

ユーザーに最初に入力を促し、その入力値に応じてループを続けるかどうかを判断する、といった場面で役立ちます。

サンプルコード:0が入力されるまで繰り返す

#include <stdio.h>

int main(void) {
    int input_num;

    do {
        printf("数値を入力してください (0で終了): > ");
        scanf("%d", &input_num);
        printf("入力された値: %d\n", input_num);
    } while (input_num != 0); // 入力値が0でない間、ループを続ける

    printf("プログラムを終了します。\n");
    return 0;
}

【非推奨】goto 文について

goto文は、プログラムの実行を指定したラベルに強制的にジャンプさせる機能です。

// goto文の例(使用は推奨されません)
if (error_condition) {
    goto ERROR_HANDLER;
}
...
ERROR_HANDLER:
    printf("エラーが発生したため終了します。\n");

一見便利に見えるかもしれませんが、gotoを多用すると、プログラムの処理の流れが上から下へと進まず、あちこちにジャンプする**「スパゲッティコード」**と呼ばれる、非常に追いにくく、バグの温床となるコードを生み出します。

現代の構造化プログラミングでは、if, for, while, break などを適切に使うことで、goto を使わずに、よりクリーンで分かりやすいロジックを組むことができます。特別な理由がない限り、gotoの使用は避けるべきです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次