C言語のきほん|無限ループの作り方と止め方

終わりのない繰り返しも、止めどころが分かれば怖くない。無限ループの作り方と止め方をやさしく身につけましょう

繰り返し処理を学んでいると、決まった回数だけ繰り返すループだけでなく、いつ終わるかをその場の状況で決めたいループが必要になることがあります。
たとえば、正しい入力があるまで何度でも受け付けたいときや、終了の合図が入るまで処理を続けたいときです。

そんな場面でよく使われるのが 無限ループ です。
無限ループという言葉だけを見ると、なんだか危なそうに感じるかもしれませんが、実際には とても実用的な書き方 です。
大切なのは、ただ永遠に回し続けるのではなく、必要な条件がそろったら break文 で適切に止めることです。

つまり、無限ループは 終わらないループ というより、終わるタイミングをループの中で決めるループ と考えると分かりやすいです。
この考え方が身につくと、入力処理やメニュー処理、ゲームの判定処理など、実際のプログラムでよく使われる流れがとても書きやすくなります。

ここでは、無限ループとは何か、while文とfor文でどう書くのか、そして break文でどのように終了させるのかを、やさしく丁寧に見ていきます。
そのあとで、実践問題と解答例も通して、実際にどう使うのかをしっかり確認していきましょう。

無限ループとは

無限ループとは、その名の通り 本来のままでは終わりが決まっていない繰り返し処理 のことです。
条件が常に真になるように書かれているため、そのままではずっと処理が続きます。

ただし、C言語で無限ループを書くときは、単に止まらない処理を作りたいわけではありません。
多くの場合は、ループの途中で if文 で条件を調べ、条件を満たしたら break文 で終了させます。

つまり、無限ループは次のような考え方で使います。

  • とりあえず繰り返し続ける
  • 途中で終了条件を判定する
  • 条件を満たしたら break文 で抜ける

この形は、終了のタイミングが事前にははっきり決まっていない処理に向いています。

なぜ無限ループが必要なのか

普通のループなら、for文の回数やwhile文の条件で制御できそうに思えます。
もちろん、それで十分な場合もたくさんあります。

でも実際には、何回で終わるか分からない処理も多いです。
たとえば、次のような場面です。

場面無限ループが向いている理由
正しい入力があるまで繰り返す何回目で正解になるか分からない
終了の合図が入るまで続けるユーザがいつ終わりの値を入れるか分からない
メニュー処理を続ける終了メニューが選ばれるまで続けたい
ゲームの進行勝敗や終了条件が途中で決まる

このように、終わる回数ではなく 終わる条件 が大事な処理では、無限ループがとても自然です。

while文で無限ループを書く方法

while文では、条件式に 1 を書くことで無限ループを作れます。

while (1) {
    文1;
    if (条件式)
        break;
    文2;
}

ここでの 1 は真を表します。
つまり while (1) は 常に真 なので、ずっと繰り返します。

そのままでは終わりませんが、途中で break文 を実行すれば、その時点でループを終了できます。

while (1) の流れ

この書き方はとてもよく使われます。
特に入力処理では、回数をあらかじめ決めずに何度でも受け付けたいことが多いので、while (1) は基本として覚えておくと便利です。

while (true) という書き方

C99以降では、stdbool.h をインクルードすると true が使えます。
そのため、次のように書くこともできます。

#include <stdbool.h>

while (true) {
    /* 処理 */
}

意味としては while (1) と同じです。
ただし、教科書や学習段階では while (1) がよく使われるので、まずはこちらに慣れておくと読みやすいでしょう。

for文で無限ループを書く方法

for文では、初期化・条件式・更新式の3つをすべて省略して書くことで、無限ループになります。

for (;;) {
    文1;
    if (条件式)
        break;
    文2;
}

for (;;) は 条件が書かれていないため、終了のきっかけがなく、ずっと繰り返す形 になります。

while (1) と同じく、break文 を使って途中で終了させるのが基本です。

while文とfor文の無限ループの違い

どちらも無限ループとして使えますが、見た目や用途の印象には少し違いがあります。

書き方特徴
while (1)条件が常に真であることが分かりやすい
for (;;)無限ループの定番表現で、すっきり短く書ける

どちらを使っても構いませんが、入力を受け続けるような処理では while (1) のほうが意味をつかみやすいことが多いです。

do~while文で無限ループはあまり使わない理由

do~while文でも理屈の上では無限ループは作れます。
たとえば、条件を常に真にすれば可能です。

ただし、do~while文は 条件が最後に出てくる ため、コードを読んだ瞬間には無限ループなのかどうかが分かりにくいです。
そのため、無限ループを書くときは通常 while文 か for文 が使われます。

ここは読みやすさの問題です。
無限ループは特に終了条件の見通しが大事なので、分かりやすい形で書くことが大切です。

サンプルプログラムで理解しよう

メモした件数を数えるシンプルなプログラムです。
終了の合図として 999 を入力したら受付を終了する例です。

サンプルプログラム

ファイル名:9_12_1.c

#include <stdio.h>

int main(void)
{
    int number;
    int count = 0;

    while (1) {    // 無限ループ
        printf("受付番号を入力してください(999で終了)> ");
        scanf("%d", &number);

        if (number == 999)    // 999が入力されたら終了する
            break;

        count++;
    }

    printf("受け付けた件数は%d件です。\n", count);

    return 0;
}

実行結果の例

受付番号を入力してください(999で終了)> 101
受付番号を入力してください(999で終了)> 205
受付番号を入力してください(999で終了)> 318
受付番号を入力してください(999で終了)> 999
受け付けた件数は3件です。

このプログラムの流れ

このプログラムでは、まず while (1) によって無限ループに入ります。
毎回、受付番号を入力してもらい、その値を調べます。

処理の流れは次の通りです。

  1. 受付番号を入力する
  2. 入力値が 999 かどうかを調べる
  3. 999 なら break文 でループを終了する
  4. 999 でなければ件数を1増やす
  5. 次の入力へ進む

このように、終了回数は最初から決まっていません。
でも 終了条件 ははっきり決まっています。
これが無限ループのとても大事な考え方です。

無限ループで大切なのは出口を作ること

無限ループは便利ですが、終了条件が正しく書かれていないと、本当に止まらなくなってしまいます。
そのため、無限ループを書くときは 必ず出口を意識する ことが大切です。

出口としてよく使うのは、やはり break文 です。

重要な点内容
無限ループは意図して作る間違って無限になるのではなく、必要だから使う
終了条件を明確にするどの条件で止まるかをはっきり書く
break文で抜ける条件成立時に確実に終了させる
読みやすく書く終了条件が見つけやすい位置にあると分かりやすい

無限ループは、ただ危険な書き方というわけではありません。
終了の仕組みまでセットで書けば、とても実用的です。

while文の条件で直接終了を表す方法との違い

同じ処理でも、無限ループを使わずに while文の条件で書くこともあります。
たとえば、入力値によって終了したいなら、条件式の書き方を工夫する方法もあります。

ただし、入力してからでないと終了条件が分からない処理では、無限ループにして中で判定するほうが自然なことが多いです。
とくに、

  • まず入力する
  • その値を見て続けるか決める

という流れでは、無限ループと break文 の組み合わせが分かりやすいです。

for (;;) を使った場合の形

同じ受付プログラムを for (;;) で書くと、次のようになります。

ファイル名:9_12_2.c

#include <stdio.h>

int main(void)
{
    int number;
    int count = 0;

    for (;;) {    // 無限ループ
        printf("受付番号を入力してください(999で終了)> ");
        scanf("%d", &number);

        if (number == 999)
            break;

        count++;
    }

    printf("受け付けた件数は%d件です。\n", count);

    return 0;
}

動きは while (1) と同じです。
違うのは書き方だけです。

実践問題

あらかじめ決めた合言葉の番号 7 を、ユーザに最大4回まで入力してもらう確認プログラムを作成してください。
正しい番号が入力されたら、その時点でループを終了します。

ループ終了後に、何回目で成功したのか、または最後まで成功しなかったのかを判定すると考えやすいです。

実行結果例1

確認を開始します。最大4回まで入力できます。
1回目の入力> 7
1回目で確認できました。

実行結果例2

確認を開始します。最大4回まで入力できます。
1回目の入力> 3
2回目の入力> 5
3回目の入力> 1
4回目の入力> 9
今回は確認できませんでした。正しい番号は7です。

解答例

ファイル名:9_12_3.c

#include <stdio.h>

int main(void)
{
    int answer = 7;
    int input;
    int i;

    printf("確認を開始します。最大4回まで入力できます。\n");

    for (i = 1; i <= 4; i++) {
        printf("%d回目の入力> ", i);
        scanf("%d", &input);

        if (input == answer)
            break;    // 正しい番号なら終了する
    }

    if (i <= 4)
        printf("%d回目で確認できました。\n", i);
    else
        printf("今回は確認できませんでした。正しい番号は%dです。\n", answer);

    return 0;
}

解説

この問題では、最大4回という回数の上限があるので、for文が自然です。
そして、正しい番号が入力されたら break文 で途中終了します。

ここで注目したいのは、ループを抜けたあとの i の値です。

状況ループ後の i の意味
途中で当たったそのときの回数のまま抜ける
最後まで当たらなかったループ終了後は 5 になる

そのため、if (i <= 4) なら成功、そうでなければ失敗と判定できます。
break文 は 途中で終わるための文 であり、終了後の変数の状態を見て結果を判断できる、という点も大切です。

実践問題

break文を使って、正しい合計を入力するまで計算式を表示し続けるプログラムを作成してください。

表示する式は 240 + 130 とします。

実行結果例

240 + 130 の答えは?> 360
240 + 130 の答えは?> 375
240 + 130 の答えは?> 370
正しい答えです。

解答例

ファイル名:9_12_3.c

#include <stdio.h>

int main(void)
{
    int answer;

    while (1) {    // 正解するまで繰り返す
        printf("240 + 130 の答えは?> ");
        scanf("%d", &answer);

        if (answer == 370)
            break;    // 正しい答えなら終了する
    }

    printf("正しい答えです。\n");

    return 0;
}

解説

この問題は、何回で正解するか分かりません。
そのため、最初から回数を決めるよりも、無限ループで受け付け続けるほうが自然です。

流れはとてもシンプルです。

  • 問題を表示する
  • 入力を受け取る
  • 正解なら break文 で終了する
  • 不正解なら次の繰り返しへ進む

このように、正解するまで続ける処理は、無限ループの代表例です。

実践問題

1~50の範囲で当たりの数 18 を1つ決め、ユーザがその数を当てるゲームを作成してください。
また、入力に応じて次のようなヒントを表示してください。

  • 範囲外の場合は 範囲外です。 と表示する
  • 正解より小さい場合は 当たりは○~△の範囲にあります。 と表示する
  • 正解より大きい場合も 同じ形式で範囲を狭めて表示する

実行結果例

1~50の範囲で当たりの数を当ててください。
範囲内の数を入力してください> 30
当たりは 1~29 の範囲にあります。
範囲内の数を入力してください> 10
当たりは 11~29 の範囲にあります。
範囲内の数を入力してください> 60
範囲外です。
範囲内の数を入力してください> 18
4回目で当たりました!

解答例

ファイル名:9_12_4.c

#include <stdio.h>

int main(void)
{
    int answer = 18;
    int input;
    int low = 1;
    int high = 50;
    int count = 0;

    printf("1~50の範囲で当たりの数を当ててください。\n");

    while (1) {
        printf("範囲内の数を入力してください> ");
        scanf("%d", &input);

        count++;

        if (input < low || input > high) {
            printf("範囲外です。\n");
            continue;    // 範囲外のときは次の入力へ進む
        }

        if (input == answer)
            break;    // 正解なら終了する

        if (input < answer) {
            low = input + 1;
            printf("当たりは %d~%d の範囲にあります。\n", low, high);
        }
        else {
            high = input - 1;
            printf("当たりは %d~%d の範囲にあります。\n", low, high);
        }
    }

    printf("%d回目で当たりました!\n", count);

    return 0;
}

解説

この問題では、何回目で当たるか分からないので、無限ループがぴったりです。
そして、正解したときに break文 で終了します。

さらに、この問題では low と high という2つの変数を使って、現在の正解候補の範囲を管理しています。

変数の役割

変数名役割
answer正解の数
inputユーザが入力した数
low現在の下限
high現在の上限
count何回入力したかを数える

範囲の更新方法

ユーザの入力が正解より小さければ、その数より下は候補から外れます。
だから low を input + 1 に更新します。

反対に、入力が正解より大きければ、その数より上は候補から外れます。
だから high を input - 1 に更新します。

continue文も使っている点に注目

このプログラムでは continue文 も使っています。
範囲外の値が入力されたとき、その回の残りの処理は不要なので、すぐ次の入力に進ませています。

ここでの違いを整理すると分かりやすいです。

役割
breakループそのものを終了する
continueその回の残りを飛ばして次の繰り返しへ進む

無限ループでは、この2つをうまく組み合わせるととても実践的な処理が書けます。

無限ループを書くときのコツ

無限ループは便利ですが、読みやすく安全に書くためにはコツがあります。

コツ内容
終了条件を目立たせるif と break の位置を分かりやすくする
終了の合図を明確にする0で終了、999で終了など表示でも伝える
条件を整理する何を続けて、何で止めるかをはっきりさせる
必要なら continue も使う不要な残り処理を飛ばせる

特に大事なのは、無限ループを書くなら どこで終わるのかが一目で分かるようにする ことです。
これができているコードは、読みやすく、間違いも起きにくいです。

間違えやすいポイント

最後に、学習中によくある勘違いも整理しておきます。

よくある勘違い実際の考え方
無限ループは危険だから使ってはいけない正しく出口を作ればとても便利
breakがなくても大丈夫終了条件がないと本当に止まらない
while (1) と for (;;) は全く別物どちらも無限ループとして使える
無限ループは特殊な場面だけで使う入力処理やゲーム処理などでよく使う

無限ループは、決して特別な裏技のようなものではありません。
終了条件をループの中で判定したいときに使う、自然で実用的な書き方です。
break文と組み合わせて考えることで、繰り返し処理の表現力がぐっと広がります。