
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 条件(スキップ条件)もその次に置く。
- 最後に本処理(加算など)を書く。
という並びです。サンプルもこの形にしてあります。読みやすさがぐっと上がりますよ。
