C言語のbreak文でループから脱出する【for, while, do-while】

484, 2022-05-31

目次

C言語のbreak文でループから脱出する

C言語ではループ文が使えます。
このループ文から脱出するにはどうしたらいいのでしょうか?

そうしたい場合はbreak文を使います。
この記事ではC言語のループ文からbreakする方法を解説します。

関連記事


C言語のループ文、for文とwhile文、do-while文

C言語のループ文には↓の3つがあります。

  • for文

  • while文

  • do-while文

C言語のbreak文はこれら3つのループ文で使うことができます。
使い方はどのループ文でも同じです。

今回はfor文を使って解説します。

for文からbreakする方法

C言語のfor文からbreak(脱出)したい場合があると思います。
たとえばカウント変数が一定値以上になったらループから抜ける、というような処理です。
この処理をif文とbreak文で書くとします。

その場合は↓のようなコードを書きます。

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 10; i += 1) {
        if (i >= 4) {
            break;
        }

        printf("%d\n", i);
    }

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

    return 0;
}

上記のコードを実行すると↓のような結果になります。

0
1
2
3
ループが終了しました。

if文とbreak文を組み合わせている部分は↓の部分です。

        if (i >= 4) {
            break;
        }

このif文ではカウント変数iが4以上になったら真になります。
if文が真になったらbreak文が実行されループから脱出します。

カウント変数iの出力部分は↓の部分です。

        printf("%d\n", i);

カウント変数iが「0」「1」「2」と出力されますが、カウント変数iが4以上になったらif文が真になります。
ですので4以上になったカウント変数は出力されません。

このようにif文とbreak文を組み合わせると、好きなタイミングでループから脱出するコードを書くことができます。

ループから即脱出、その名も「いきなりbreak」

この「いきなりbreak」は私がそう呼んでいるだけなのですが、使いどころが果てしなく不明です。
いきなりbreakは↓のようなコードのことを言います。

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 4; i += 1) {
        break;  // いきなりbreak!
    }

    return 0;
}

↑のfor文ではカウント変数iが4より下のあいだ実行されます。
しかしfor文の中にいきなりbreak文を書いています。
このためループが実行されると即ループが終了します。

普通はbreak文はif文などと組み合わせて使うのですが、こういった使い方も可能です。
しかしこのいきなりbreakは使いどころが果てしなく不明です。
私も15年のC言語歴で使ったことがありません。

この処理で唯一処理が実行されている部分はカウント変数iの初期化と比較です。
つまりint i = 0;i < 4が実行されます。
肝心のループは一回実行されただけで終わります。

(^ _ ^)

このbreak文の使いどころが行方不明

(・ v ・)

探し物はこのbreakの存在意義ですか?

2重のfor文でbreak文を使う

2重のfor文でbreak文を使った場合はどうなるのでしょうか?
結論から言うとbreak文は1つ目のfor文の中に書いた場合は1つ目のfor文からbreakします。

2つ目のfor文の中に書いた場合は2つ目のfor文からのみbreakします。
この場合1つ目のfor文からはbreakしません。

たとえば↓のコードを見てください。

    for (int i = 0; i < 3; i += 1) {
        for (int j = 0; j < 3; j += 1) {
            printf("i=%d j=%d\n", i, j);
        }
        break;
    }

↑の場合、break文はどのfor文から脱出するでしょうか?
正解は一番外側のfor文(カウント変数iの)から脱出します。
実行結果は↓になります。

i=0 j=0
i=0 j=1
i=0 j=2

カウント変数iが0のままで終了してますね。
i < 3なので外側のfor文はカウント変数iを3までカウントするポテンシャルを持っています。
しかしbreak文によってその処理は中断されているわけです。

では↓のコードはどうでしょうか?

    for (int i = 0; i < 3; i += 1) {
        for (int j = 0; j < 3; j += 1) {
            printf("i=%d j=%d\n", i, j);
            break;
        }
    }

上記のコードを実行すると↓のような結果になります

i=0 j=0
i=1 j=0
i=2 j=0

この場合のbreak文は内側のfor文からのみ脱出します。
つまり外側のfor文からは脱出しません。

↑の実行結果を見るとカウント変数iがカウントされてるのに対して、jがカウントされてないのがわかります。
これは内側のfor文ではprintf()の直後にbreakしているからです。

2重のfor文から一気にbreakするにはどうしたらいいか?

2重のfor文の内側から一気にbreakしたい場合があると思います。
そういう場合、gotoを使ったほうが楽です。
gotoはこういう時に大変便利な文です。

break文を使いたい場合は↓のようにフラグを使う方法が一般的です。

    int flag = 0;

    for (int i = 0; i < 3; i += 1) {
        for (int j = 0; j < 3; j += 1) {
            flag = 1;
            break;
        }
        if (flag) {
            break;
        }
    }

2重のfor文の内側からbreakしたい場合は↑のようにフラグとbreak文を2回使います。
一気にbreakしたいところですが、このように地道に1つずつbreakしていくしかありません。

goto文を使う場合は↓のようにコードを書けます。

    for (int i = 0; i < 3; i += 1) {
        for (int j = 0; j < 3; j += 1) {
            goto done;
        }
    }
done:
    printf("gotoしました。\n");

大変シンプルですね。
gotoは使い方を誤るとコードがぐちゃぐちゃになることもあります。
しかし用法容量を守り安全に使えばこのように大変便利に機能します。
ですがgotoに拒否反応を示す人は大変多いですので、複数人の開発ではコーディングルールを確認してください。

おわりに

今回はC言語のbreak文でループから脱出する方法を解説しました。
break文を使えるようになっておけば好きなタイミングでループからbreakできます。
マスターしておきたいところですね。

(^ _ ^)

breakしようぜ

(・ v ・)

アフタヌーンティーをどうぞ



この記事のアンケートを送信する