C言語基礎|無限ループとbreak・continue文

はじめに:無限ループは「止め方」をセットで覚えると怖くないよ

無限ループって聞くと、「えっ…止まらないって大丈夫?」って不安になりますよね。
でもC言語では、わざと無限ループを作っておいて、必要なタイミングで break で抜けるという書き方がよく出てきます。

さらに、ループの途中で「この回は処理したくないな」というときには continue が便利です。
この2つを使えるようになると、入力処理やデータ処理が一気に書きやすくなります。

サンプル:温度を次々に読み込み、平均を出す(終了入力で break/異常値は continue)

  • 999 が入力されたら 終了(break)
  • あり得ない温度(例:-50未満または 60より大きい)は 無視(continue)
  • 正常値だけを合計して平均を出す

プロジェクト名:chap4-13-1 ソースファイル名:chap4-13-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 温度を読み込み、正常値だけで平均を求める(999で終了)
#include <stdio.h>

int main(void)
{
    int t;
    int sum = 0;
    int cnt = 0;

    puts("温度を入力してください(終了は 999)。");

    while (1) {   // ここが無限ループ
        printf("温度:");
        scanf("%d", &t);

        if (t == 999) {              // 終了の合図
            break;
        }

        if (t < -50 || t > 60) {     // 異常値は無視
            puts("その温度は範囲外なので無視します。");
            continue;
        }

        sum += t;    // 正常値だけ加算
        cnt++;
    }

    if (cnt == 0) {
        puts("正常な温度が1件もありませんでした。");
    } else {
        printf("入力件数:%d\n", cnt);
        printf("平均温度:%.1f\n", (double)sum / cnt);
    }

    return 0;
}

実行例

温度を入力してください(終了は 999)。
温度:20
温度:80
その温度は範囲外なので無視します。
温度:15
温度:999
入力件数:2
平均温度:17.5

無限ループとは(while(1) が意味すること)

無限ループの基本

書き方意味どうなる?
while (1) { ... }条件が常に真ずっと繰り返す
while (0) { ... }条件が常に偽1回も実行されない
while (式) { ... }式が真の間だけ条件次第で繰り返す

C言語では 0 が偽、0以外が真 とみなされます。
だから 1 は常に真 → while (1) は永遠に続くループになります。

ただし、実際には break を実行した瞬間に抜けられるので、
「止め方込み」で安全に使うのがポイントです。

break 文:ループを強制終了する

break は、ループの中から その場でループを抜ける命令です。

break の役割

項目内容
役割ループを即終了する
使う場所while / do / for / switch の中
効果ループ本体の残りを実行せず、ループの外へ移動

サンプルだとここですね。

if (t == 999) {
    break;
}

これがあるから、while (1) の無限ループでも、必要なタイミングで終われます。

break の流れ

ループ中
  ↓
break 実行
  ↓
ループの外へジャンプ(強制終了)

continue 文:ループ本体の残りをスキップする

continue は、ループを終わらせるのではなく、
その回の残り処理を飛ばして、次の繰り返しに進む命令です。

continue の役割

項目内容
役割ループ本体の残りを飛ばす
使う場所while / do / for の中
効果直ちに次の繰り返しへ(whileなら制御式へ)

サンプルだと、異常値のときに加算したくないので continue を使っています。

if (t < -50 || t > 60) {
    puts("その温度は範囲外なので無視します。");
    continue;
}

この continue があることで、下の sum += t; と cnt++; が実行されず、
「異常値は集計に入れない」が自然に実現できます。

continue の流れ

ループ中
  ↓
continue 実行
  ↓
ループ本体の残りをスキップ
  ↓
次の繰り返しへ(whileなら条件判定へ)

break と continue の働きの違い(ループ内の位置関係で理解)

ループ内の制御

while (条件) {
    処理A

    break;     → ループを抜ける(外へ)

    continue;  → 処理Bを飛ばして次の周回へ

    処理B
}

break と continue の違いまとめ

命令何をする?どこへ移動?よく使う場面
breakループ自体を終わらせるループの外終了入力、探索が完了した
continueその回の残りを飛ばす次の周回(条件判定)異常値、対象外データをスキップ

登場した命令の書式まとめ(ループ制御を整理)

while 文

書式何をする?
while (式) 文式が真の間、文を繰り返す
while (1) { ... }無限ループ(止めるには break を使う)

break 文

書式何をする?
break;もっとも内側のループや switch を抜ける

continue 文

書式何をする?
continue;ループ本体の残りを飛ばして次の周回へ

つまずきポイント:無限ループは「終了条件」を必ず目で追える位置に置く

無限ループの便利さは強力なんですが、初心者のうちは

  • どこで終わるの?
  • どの条件で continue されるの?

が見えにくいと混乱します。

なのでおすすめは、

  • break 条件(終了条件)をループの上のほうに置く。
  • continue 条件(スキップ条件)もその次に置く。
  • 最後に本処理(加算など)を書く。

という並びです。サンプルもこの形にしてあります。読みやすさがぐっと上がりますよ。