C PR

【C言語 – for,while】二重ループからのスマートな脱出

記事内に商品プロモーションを含む場合があります

forや、whileといったループ文の二重処理において、
【内ループから抜ける時に、外ループからも抜けたい】
って時、意外と面倒だったりしません?

どうにかならないものかと、いろいろと考えてみました。

例①

for (i = 0; i < outerMax; i++) {
    for (j = 0; j < innerMax; j++) {
        if (flag) {
            isError = true;
            break;
        }
    }

    if (isError) {
        break;
    }
}

内ループでフラグを立ててbreakし、外ループで参照する方法。
多分、最もポピュラーなもの?
この方法を取っている現場が最も多かった気がします。

ただ、個人的には2回判定するのがちょっと嫌なんですよね。。。

例②

for (i = 0; i < outerMax; i++) {
    for (j = 0; j < innerMax; j++) {
        if (flag) {
            goto _EXIT;
        }
    }
}
_EXIT:

授業で使っちゃだめだよ!と教わるgoto文で抜ける方法。
goto文の使用を禁止している現場は多く、使う機会は少ないかもしれません。
静的解析にも引っかかる可能性が高いため使用は避けた方が良いかも。

個人的には嫌いじゃないんですけどね。
どうでもよい変数や、判定が増えた方がよっぽど可読性を落とす気が。。。

例③

for (i = 0; i < outerMax; i++) {
    for (j = 0; j < innerMax; j++) {
        if (flag) {
            i = outerMax;
            break;
        }
    }
}

外ループの終了条件を無理やり満たしてしまう方法。
これは一見して分かりにくい。

また、「内ループ終了後に、外ループの処理が残っていないこと」という条件付きですね。
もし私がレビュワーだったら却下してます。

例④

for (i = 0; i < outerMax; i++) {
    for (j = 0; j < innerMax; j++) {
        if (flag) {
            return;
        }
    }
}

関数化するという方法です。
これが一番スッキリするかな。。。

ただし、処理の内容によっては、引数が膨大になったり、グローバル変数を用いる羽目にもなり兼ねないため、使用する場面は選んだ方が良さそうです。

結果

場面にもよりますが、①か④が良いですかね。
もし他にも案があったら教えてください。

ってか、パッと見て面倒くさそうなコードは書かない!