6日でできる 新C言語入門|無限ループとbreak文の使い方

終わらないループを正しく使いこなして、必要なところでしっかり止める。

プログラムでは、同じ処理を何度も繰り返したい場面がよくあります。
そのときに使うのが、for文やwhile文、do〜while文といったループ構文です。

その中でも無限ループは、名前のとおり、終了条件を書かなければずっと繰り返し続けるループのことを指します。最初に聞くと少し危険なものに感じるかもしれませんが、実は無限ループそのものが悪いわけではありません。大切なのは、どのような目的で使い、どこで止めるのかをきちんと設計することです。

たとえば、ユーザーからの入力を待ち続ける処理や、機器の状態を監視し続ける処理では、無限ループが自然に使われます。一方で、終了条件の書き忘れや変数更新のミスによって、意図せず無限ループになってしまうこともあります。そうなると、プログラムが止まらなくなったり、CPUを無駄に使い続けたりしてしまいます。

そこで重要になるのがbreak文です。break文を使うと、ループの途中で条件に応じて繰り返しを終了できます。無限ループとbreak文は、セットで理解しておくととても便利です。

この記事では、無限ループの基本的な考え方、while文やfor文による書き方、break文で安全に抜ける方法、そして実際に使うときの注意点まで、やさしく順番に解説していきます。

無限ループとは何か

無限ループとは、終了条件がない、または終了条件が満たされないために、処理がずっと繰り返される状態のことです。

たとえば、while文は条件式が真である間、処理を繰り返します。そのため、常に真になる条件を書けば、ループは終わりません。

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

この1という値は真として扱われるため、while (1) はずっと繰り返されます。

for文でも同じように無限ループを作れます。

for (;;) {
    /* 処理 */
}

for文は通常、初期化式、条件式、増分式の3つを書きますが、これらをすべて省略すると、条件式が存在しないため、終了せずに繰り返し続けます。

書き方意味
while (1)条件が常に真なので、ずっと繰り返す
for (;;)条件式がなく、終了判定がないので、ずっと繰り返す

無限ループという言葉だけを見ると、すべて危険なもののように感じるかもしれません。しかし実際には、意図的に使う無限ループと、ミスで発生する無限ループの2種類があります。この違いをしっかり区別しておくことが大切です。

図:無限ループの基本イメージ

この図から分かること

この図から分かるのは、無限ループは処理が終わっても再び同じ場所へ戻り続ける構造になっていることです。
また、while (1) と for (;;) は見た目は異なっていても、どちらも終了条件を持たないループとして使えることが分かります。さらに、break文を使えば、必要なタイミングでループの外へ抜けられることも確認できます。

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

while文は、条件式が真の間だけ処理を繰り返します。ですから、条件式に常に真になる値を書けば、無限ループになります。

プロジェクト/ファイル名: Lesson29_1/main.c

#include <stdio.h>

int main(void) {
    int count = 1;

    // 5回表示したら break で終了する例
    while (1) {
        printf("%d回目のメッセージです。\n", count);

        // 表示回数が5回になったらループを抜ける
        if (count >= 5) {
            break;
        }

        count++;
    }

    printf("ループを終了しました。\n");

    return 0;
}

実行結果

1回目のメッセージです。
2回目のメッセージです。
3回目のメッセージです。
4回目のメッセージです。
5回目のメッセージです。
ループを終了しました。

このプログラムは、while (1) で無限ループの形を作っています。
ただし、本当に永久に繰り返すわけではなく、if文の中でcount >= 5になったらbreakを実行することで、5回目でループを終了しています。

ここで大事なのは、無限ループの形を使いながらも、内部で終了条件を明確に管理している点です。これが、実用的な無限ループの基本的な考え方です。

while文の無限ループでよくある誤り

無限ループは、意図して使うこともありますが、意図せず発生することもあります。代表的なのは、条件に関係する変数を更新し忘れるケースです。

たとえば次のようなコードでは、numberの値が変化しないため、条件がずっと真のままになる可能性があります。

int number = 0;

while (number < 5) {
    printf("%d\n", number);
}

このコードでは、number < 5 が真のままなのに、numberを増やす処理がありません。そのため、ループを抜けられません。

原因内容
更新処理の書き忘れ条件に使う変数の値が変わらない
条件式の誤り本来は偽になるはずが、ずっと真になっている
抜ける処理の不足breakなどの終了手段がない

無限ループを防ぐには、処理の流れを次の3点で確認すると分かりやすいです。

確認ポイント見る内容
条件何を満たしている間、繰り返すのか
更新条件に関係する値は変化しているか
終了いつ、どこでループを終えるのか

for文でも無限ループは書ける

for文でも無限ループを書くことができます。書き方はとてもシンプルで、次のようになります。

for (;;) {
    /* 繰り返したい処理 */
}

for文は本来、初期化、条件、増分をまとめて書ける便利な構文です。しかし、それらを全部省略すると、終了条件がない状態になります。そのため、処理はずっと続きます。

for文の無限ループは、特に「繰り返すこと自体を主役にしたい」ときによく使われます。たとえば、メニューを表示し続ける処理や、入力待ちの処理などです。

while (1) と for (;;) はどちらを使っても構いませんが、次のような感覚で使い分けることが多いです。

書き方印象
while (1)条件が常に真であることを明示しやすい
for (;;)繰り返し専用の構文としてすっきり見せやすい

どちらも意味としてはほぼ同じです。大切なのは、自分やほかの人が読みやすい形で書くことです。

break文とは何か

break文は、ループやswitch文の途中で、その処理を打ち切るための命令です。
ループの中でbreakが実行されると、その場でループを終了し、ループの次の処理へ進みます。

基本形はとてもシンプルです。

break;

break文は、次のような場面でよく使います。

使いどころ説明
条件を満たしたら終了したい目的の値が見つかったら抜ける
入力によって終了したい終了用の値が入力されたら抜ける
異常値が出たら中断したい想定外の状態になったら処理を止める

無限ループとbreak文の相性がよい理由は、最初にループの形だけを作っておき、終了したい条件を内部に自然に書けるからです。
これによって、入力待ちやメニュー処理のような流れが見やすくなります。

図:break文でループを抜ける流れ

この図から分かること

この図から分かるのは、break文はループの途中からでも外へ抜けられるということです。
無限ループを使っていても、終了条件を満たした瞬間にbreak文を実行すれば、必要なところで繰り返しを止められます。つまり、無限ループは止まらない処理ではなく、止め方を自分で決める処理として使えるわけです。

break文を使った入力ループの例

次は、ユーザーが負の値を入力したら終了するプログラムです。
これは無限ループとbreak文の組み合わせとして、非常によくある形です。

プロジェクト/ファイル名: Lesson29_2/main.c

#include <stdio.h>

int main(void) {
    int num;

    printf("0未満の値を入力すると終了します。\n");

    while (1) {
        // 数値の入力を受け付ける
        printf("点数を入力してください: ");
        scanf("%d", &num);

        // 負の値が入力されたらループを終了する
        if (num < 0) {
            break;
        }

        // 入力された値をそのまま表示する
        printf("入力された点数は%dです。\n", num);
    }

    printf("入力処理を終了しました。\n");

    return 0;
}

実行結果

0未満の値を入力すると終了します。
点数を入力してください: 80
入力された点数は80です。
点数を入力してください: 65
入力された点数は65です。
点数を入力してください: 0
入力された点数は0です。
点数を入力してください: -1
入力処理を終了しました。

このプログラムでは、while (1) によって入力待ちを繰り返しています。
そして、num < 0 になったときだけbreakで抜けています。

この形のよいところは、終了条件がとても見つけやすいことです。
ループの中で何をして、どの条件で終えるのかが、上から順に読み取りやすくなっています。

なお、Visual Studioでscanfを使うと、環境によって警告が表示されることがあります。学習用途では設定を確認しながら進めるとよいでしょう。

break文はfor文やdo〜while文でも使える

break文はwhile文だけでなく、for文やdo〜while文でも使えます。

たとえば、for文の無限ループで書くと次のようになります。

for (;;) {
    printf("処理を繰り返します。\n");

    if (終了条件) {
        break;
    }
}

do〜while文でも同じ考え方で書けます。

do {
    printf("最低1回は実行される処理です。\n");

    if (終了条件) {
        break;
    }
} while (1);

それぞれ構文の見た目は違いますが、考え方は同じです。
まず繰り返しの枠組みを作り、その中で必要なタイミングにbreakを置くことで、ループを終了します。

ループ構文break文の使い方
while文条件付き終了を書きやすい
for文繰り返し処理を簡潔に書きやすい
do〜while文最低1回は実行したい処理に向く

無限ループの実用的な使い道

無限ループは、単なる学習用の題材ではなく、実際のプログラムでも広く使われています。

ユーザー入力を受け付け続ける処理

メニュー画面や入力フォームのように、ユーザーが終了を選ぶまで繰り返す処理では、無限ループが自然です。

サーバーや監視プログラム

サーバープログラムや機器の監視処理では、基本的に処理を止めずにずっと動き続ける必要があります。そのため、無限ループをベースにしながら、必要に応じて終了や異常処理を挟む形がよく使われます。

ゲームや制御処理

ゲームのメインループや、組み込み機器の制御処理でも、プログラムが動いている間は処理を続けることが多いため、無限ループが役立ちます。

用途無限ループが向いている理由
入力待ち終了指示が出るまで繰り返せる
監視処理常に状態を確認し続けられる
ゲーム処理画面更新や入力判定を継続できる
制御プログラム機器の動作を止めずに管理できる

意図しない無限ループに注意する

無限ループは便利ですが、意図せず発生すると厄介です。特に初心者のうちは、次のようなミスが起こりやすいです。

ミス
変数を更新していないi++ を書き忘れる
条件式を間違えている< と <= を取り違える
breakの条件が成立しない終了条件が厳しすぎる
入力値を正しく受け取れていない想定どおりの判定にならない

こうしたミスを防ぐには、ループを書く前に、次のように考えるとよいです。

  • 何を繰り返すのか
  • どの条件で終えるのか
  • その条件は本当に満たされるのか
  • 条件に必要な値はちゃんと変化するのか

このように確認しながら書くと、無限ループがただのバグではなく、意図して使う便利な手法になります。

図:意図した無限ループと意図しない無限ループの違い

この図から分かること

この図から分かるのは、無限ループには便利な使い方と危険な使い方の両方があるということです。
入力待ちや監視処理のように目的を持って使う場合は、break文や終了条件を用意することで安全に運用できます。一方、更新忘れや条件ミスがあると、意図しないままループが止まらなくなってしまいます。つまり、無限ループで重要なのは、繰り返すことそのものではなく、どこで止めるかをきちんと決めることです。

break文を使うときのコツ

break文は便利ですが、どこにでも置けばよいわけではありません。読みやすく安全にするためには、いくつかコツがあります。

終了条件を分かりやすく書く

if (num < 0) のように、何を満たしたら終わるのかが一目で分かるように書くと、コードが読みやすくなります。

ループの目的と終了条件を近くに置く

入力して判定し、終了するという流れが近い場所にまとまっていると、処理の全体像がつかみやすくなります。

breakに頼りすぎない

複数の場所にbreakが散らばりすぎると、ループがどこで終わるのか分かりにくくなります。学習中は、できるだけ終了条件を整理して、読みやすく保つことを意識するとよいです。

コツ理由
終了条件を明確にするループの終わり方が分かりやすい
breakを使う位置を整理する読みやすさが保てる
コメントを添える学習段階では意図を確認しやすい

無限ループとbreak文はセットで理解すると強い

無限ループは、終わらない危険な処理というよりも、必要なタイミングまで繰り返し続けるための土台として考えると理解しやすいです。
そして、その土台の中でbreak文を使うことで、好きなタイミングでループを終了できます。

while (1) や for (;;) は、どちらも無限ループの代表的な書き方です。
break文は、while文、for文、do〜while文のどれでも使えます。

入力待ちや監視処理のように、いつ終わるかを外から決めたい処理では、無限ループとbreak文の組み合わせがとても役立ちます。反対に、条件の変化や終了条件の設計があいまいだと、意図しない無限ループに陥りやすくなります。

ループを書くときは、繰り返す理由だけでなく、どう終えるのかまでセットで考えることが大切です。そうすると、無限ループも怖いものではなく、実用的で扱いやすい技術として使えるようになります。