C言語の基本|break文の使い方

条件が成立したら、その場でループを終了。break文を使って、必要なところで止まれる繰り返し処理を作ろう。

繰り返し処理は、同じ作業を何度も実行するときに便利です。しかし、すべての処理を予定した回数まで続ける必要があるとは限りません。

たとえば、次のような場面があります。

  • 探していたデータが見つかった
  • 終了を表す値が入力された
  • 処理を続けられない異常な値が見つかった
  • メニューで終了が選択された

このように、ループを続ける必要がなくなったときに使うのがbreak文です。

break文が実行されると、ループの継続条件が真であっても、その場で繰り返しを終了できます。その後はプログラム全体が終わるのではなく、ループの直後にある処理へ進みます。

break文はfor文、while文、do~while文で使用できます。また、switch文から抜けるときにも使われます。ここでは、ループを途中で終了する使い方を中心に見ていきましょう。

break文とは

break文は、現在実行しているループを途中で終了させるための文です。

通常のループは、継続条件が偽になるまで繰り返されます。break文を使うと、継続条件の次の判定を待たずにループから抜けられます。

たとえば、最大10回繰り返すfor文であっても、4回目に終了条件が成立すれば、残りの6回は実行されません。

break文は、ループの中に設ける非常口のようなものです。ただし、どのような場合に非常口を使うのか、終了条件を分かりやすく書くことが大切です。

図1:break文でループから抜ける流れ

この図から分かること

終了条件が偽なら、そのままループ内の処理を続け、次の繰り返しへ進みます。

終了条件が真になるとbreak文が実行されます。この瞬間にループは終了し、制御はループの外側へ移ります。

重要なのは、break文より後ろに書かれているループ内の処理が実行されないことです。break文をどこに置くかによって、その回で実行される処理の範囲が変わります。

break文を使用できる場所

break文は、主に次の制御文で使用できます。

使用場所break文の役割
for文回数の上限に達する前でもループを終了する
while文継続条件が真でも途中でループを終了する
do~while文ループ本体を実行した後、必要な時点で終了する
switch文一致したcaseの処理を終えてswitch文から抜ける

ループ内のbreak文は、実行中の繰り返しを終了します。一方、switch文内のbreak文は、次のcaseへ処理が続くフォールスルーを防ぐ目的で使われます。

今回はループ内での使い方が中心ですが、どちらも現在の制御構造から抜けるという点は共通しています。

break文の基本的な書き方

break文は、次のようにif文と組み合わせるのが一般的です。

繰り返し処理 {
    処理1;

    if (終了条件) {
        break;
    }

    処理2;
}

この処理は、次の順番で進みます。

  1. 処理1を実行する
  2. if文で終了条件を判定する
  3. 条件が真ならbreak文を実行する
  4. 条件が偽なら処理2を実行する
  5. 次の繰り返しへ進む

break文が実行された場合、処理2は実行されません。そのままループの外にある次の文へ移動します。

if文と組み合わせる理由

break文は、条件に応じてループを終了するため、通常はif文と一緒に使います。

たとえば、変数answerが0になったら終了したい場合は、次のように書けます。

if (answer == 0) {
    break;
}

answerが0なら条件が真になり、ループが終了します。0でなければbreak文は実行されず、ループ内の次の処理へ進みます。

反対に、条件を付けずにbreak文を書くと、ループに入った直後に必ず終了します。

for (int i = 0; i < 5; i++) {
    break;
}

このfor文には5回という繰り返し条件がありますが、1回目で必ずbreak文が実行されます。そのため、実際には1回で終了します。

文法として書ける場合でも、終了条件のないbreak文はループをほとんど活用できません。何のために終了するのかをif文で明確にするのが基本です。

break文が実行された後の動き

break文は、プログラム全体を終了する命令ではありません。また、関数を終了するreturnとも役割が異なります。

終了する範囲終了後の動き
break現在のループまたはswitch文制御構造の直後へ進む
continue現在の繰り返しの残り次の繰り返しへ進む
return現在の関数呼び出し元へ戻る
ループ条件が偽現在のループループの直後へ進む

次の形では、break文によってループを抜けた後、終了後の処理が実行されます。

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

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

whileの条件に1を指定すると、条件は常に真になります。そのため、通常の条件判定では終了しません。ループ内のbreak文が出口になります。

この書き方を使用する場合は、break文へ必ず到達できることを確認しましょう。終了条件が成立しない構造になっていると、無限ループになります。

break文を使うときの注意点

break文は便利ですが、使う場所が増えすぎると処理の流れを追いにくくなります。

注意点確認する内容
終了条件を明確にする何が起きたらループを終了するのか分かるようにする
無条件で使わないループに入った直後に必ず終了する書き方を避ける
多用しすぎないループ内の出口が増えると流れを追いにくくなる
配置場所を確認するbreakより後ろの処理が実行されないことを意識する
終了後の処理を確認するループを抜けた後にどの文へ進むか確認する

break文の数を機械的に1つにする必要はありません。ただし、複数のbreak文がある場合は、それぞれの終了理由が読み手に伝わるようにすることが大切です。

入力された値を使って途中終了する

ここでは、貸出カード番号を最大6件まで入力するプログラムを作ります。

番号として0が入力された場合は、受付を途中で終了します。0は終了を指示する値なので、受付件数には含めません。

図2:終了用の値は件数に含めない

この図から分かること

0が入力されるまでは、入力されたカード番号を有効なデータとして数えます。

0が入力されるとbreak文が実行されるため、その後ろにある件数の加算処理には進みません。そのため、終了用の0は件数に含まれません。

このように、終了用として特別な意味を持たせた値をセンチネル値と呼ぶことがあります。センチネル値を判定する位置と、通常の処理を行う位置を分けることが大切です。

貸出カード番号を最大6件まで受け付けるプログラム

ファイル名:9_10_1.c

#include <stdio.h>

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

    for (int i = 1; i <= 6; i++) {
        printf("貸出カード番号を入力してください(0で終了)> ");
        scanf("%d", &card_number);

        /* 0が入力されたら受付を終了する */
        if (card_number == 0) {
            break;
        }

        /* 0以外の番号を受付件数に加える */
        count++;
    }

    printf("受け付けたカード番号は%d件です。\n", count);

    return 0;
}
実行結果の例
貸出カード番号を入力してください(0で終了)> 314
貸出カード番号を入力してください(0で終了)> 527
貸出カード番号を入力してください(0で終了)> 608
貸出カード番号を入力してください(0で終了)> 0
受け付けたカード番号は3件です。

プログラムの処理を順番に確認する

このプログラムでは、for文によって最大6件のカード番号を受け付けます。ただし、6件すべてが入力される前に0が入力されると、break文によって受付を終了します。

1回目に314が入力されたときは、次のように進みます。

  • card_number == 0は偽になる
  • break文は実行されない
  • count++によって件数が1になる
  • 次の繰り返しへ進む

2回目の527と3回目の608も0ではないため、countが1ずつ増えます。この時点でcountは3です。

4回目に0が入力されると、次の条件が真になります。

if (card_number == 0) {
    break;
}

break文が実行されると、for文はその場で終了します。break文より後ろにあるcount++には進みません。

その後、制御はfor文の直後へ移り、次の文が実行されます。

printf("受け付けたカード番号は%d件です。\n", count);

countは3のままなので、受付件数として3件が表示されます。

0が入力されなかった場合

6回の入力で一度も0が入力されなければ、break文は実行されません。その場合、for文は通常どおり6回で終了します。

たとえば、6件すべてに有効な番号が入力された場合は、countの値が6になります。

このプログラムには、2種類の終了方法が用意されていることになります。

終了方法終了する条件
通常終了for文が6回の繰り返しを終える
途中終了入力値が0になりbreak文が実行される

最大件数はfor文で制限し、利用者からの終了指示にはbreak文で対応しています。回数による終了と入力値による終了を組み合わせた形です。

for文の継続条件だけでは書きにくい理由

for文には、繰り返しを続けるための条件があります。

for (int i = 1; i <= 6; i++) {
    処理;
}

この条件だけでも、最大6回という上限は管理できます。しかし、利用者が何回目に0を入力するかは、ループを始める前には分かりません。

入力値は、scanfが実行された後で初めて確認できます。そのため、ループ本体の中で終了条件を判定し、必要ならbreak文で抜ける書き方が分かりやすくなります。

break文が向いているのは、ループの途中で判明する条件によって終了したい場面です。

break文が役立つ代表的な処理

break文は、次のような処理でよく使われます。

処理break文を使う理由
データの探索目的のデータが見つかれば、それ以上探す必要がない
入力の受付終了用の値が入力された時点で受付を終えたい
エラーの検出異常を検出した後の処理を続けたくない
メニュー処理終了が選ばれるまでメニューを繰り返したい
上限付きの入力最大回数を設けながら途中終了も可能にしたい

たとえば配列から特定の値を探す場合、見つかった後も最後まで比較を続ける必要はありません。目的の値が見つかった時点でbreak文を実行すれば、不要な繰り返しを省けます。

while文とdo~while文でも使える

break文の役割は、ループの種類が変わっても同じです。

while文では、次のような形で使用できます。

while (1) {
    入力処理;

    if (終了条件) {
        break;
    }

    通常の処理;
}

while (1)は条件が常に真になるため、そのままでは終了しません。ループ内のbreak文が終了条件を担当します。

do~while文でも、ループ本体の途中でbreak文を実行できます。

do {
    入力処理;

    if (終了条件) {
        break;
    }

    通常の処理;
} while (継続条件);

do~while文はループ本体を最低1回実行しますが、break文が実行されれば、末尾の継続条件を判定せずに終了します。

break文とcontinue文の違い

break文とcontinue文は、どちらもループ内の通常の流れを変える文です。ただし、その後の進み方が異なります。

その回の残り次の繰り返しループの外へ移動
break実行しない進まない移動する
continue実行しない進む移動しない

break文が実行されると、ループそのものが終わります。

continue文が実行されると、その回の残りだけを飛ばし、ループは継続します。for文の場合は更新式へ進み、while文やdo~while文では継続条件の判定へ進みます。

終了したいのか、今回だけ処理を省略したいのかを考えて使い分けましょう。

図3:break文とcontinue文の進み方

この図から分かること

break文とcontinue文は、どちらもその回の残りの処理を実行しない点では共通しています。

違いは、ループを続けるかどうかです。

  • break文はループ全体を終了する
  • continue文はループを終了せず、次の繰り返しへ進む

終了用の値が入力された場合はbreak文が向いています。一方、無効なデータだけを集計対象から外し、次の入力は続けたい場合にはcontinue文が向いています。

多重ループでは一番内側だけを終了する

多重ループでbreak文を使う場合は、どのループを終了するのかに注意が必要です。

for (int row = 1; row <= 3; row++) {
    for (int col = 1; col <= 5; col++) {
        if (終了条件) {
            break;
        }
    }
}

このbreak文が終了させるのは、colを使っている内側のfor文だけです。rowを使っている外側のfor文は終了しません。

内側のループを抜けた後は、外側のfor文の次の繰り返しへ進みます。break文1つですべてのループをまとめて終了するわけではありません。

多重ループ内でbreak文を見つけたら、次の点を確認しましょう。

  • break文を直接囲んでいるループはどれか
  • break文より外側に別のループがあるか
  • 内側だけを終了する動きで目的を達成できるか

読みやすいbreak文を書くためのポイント

break文を使うときは、ループの目的と終了条件が自然に読み取れるようにします。

  • 終了条件をif文にまとめる
  • 終了を表す値を入力案内に明記する
  • break文より後ろに実行したい処理を置かない
  • break文の数を必要以上に増やさない
  • コメントには終了する理由を書く
  • ループを抜けた後に実行される処理を確認する
  • 多重ループでは終了対象となるループを確認する

break文は短い文ですが、繰り返し処理を実用的にする大切な役割を持っています。最後まで繰り返す必要がなくなった時点で、どこから抜け、次にどこへ進むのかを意識して使うことがポイントです。