LoginSignup
17
7

More than 1 year has passed since last update.

多重ループからの脱出(continueとbreakの違い)

Last updated at Posted at 2022-08-09

はじめに

ネストされたfor文の中でcontinueとbreakの挙動の違いを整理しました。
JavaScriptで記載していますが、Javaでも同様に記載できます。

目次

1. サンプル
2. continue
3. break
4. さらに深いループ
5. ラベルを使用したcontinue
6. ラベルを使用したbreak
7. まとめ

1. サンプル

次のような簡単な配列の多重ループを例にします。

const loopA = [1, 2];
const loopB = [1, 2, 3];

for (const a of loopA) {
    for (const b of loopB) {
        console.log(`A${a}-B${b}`);
    }
}

// 出力結果↓↓
// A1-B1
// A1-B2
// A1-B3
// A2-B1
// A2-B2
// A2-B3

2. continue

continueはそのループの残りの処理をスキップして次のループへ移ります。
この例では内側のループ(loopB)が2のときは出力しません。

const loopA = [1, 2];
const loopB = [1, 2, 3];

for (const a of loopA) {
    for (const b of loopB) {
        if (b === 2) {
            continue;
        }
        console.log(`A${a}-B${b}`);
    }
}

// 出力結果↓↓
// A1-B1
// A1-B3
// A2-B1
// A2-B3

3. break

breakではそのループ自体が終了します。
先ほどのcontinueと同じ場所でbreakを使用すると、内側のループ(loopB)はそこで終了し、2以降は出力されず外側のループ(loopA)の次のループに移ります。

const loopA = [1, 2];
const loopB = [1, 2, 3];

for (const a of loopA) {
    for (const b of loopB) {
        if (b === 2) {
            break;
        }
        console.log(`A${a}-B${b}`);
    }
}

// 出力結果↓↓
// A1-B1
// A2-B1

4. さらに深いループ

今回はcontinueとbreakの違いを確認するため、さらに深く潜ってみます。

const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];

for (const a of loopA) {
    for (const b of loopB) {
        for (const c of loopC) {
            console.log(`A${a}-B${b}-C${c}`);
        }
    }
}

// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1
// A1-B2-C2
// A1-B2-C3
// A2-B1-C1
// A2-B1-C2
// A2-B1-C3
// A2-B2-C1
// A2-B2-C2
// A2-B2-C3

これをサンプルに挙動の違いを確認していきます。

5. ラベルを使用したcontinue

ラベルを使用することで任意の場所でループを終了することができます。
今回はLABELとしていますが、ラベルには任意の文字列を指定することができます。

const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];

LABEL:for (const a of loopA) {
    for (const b of loopB) {
        for (const c of loopC) {
            console.log(`A${a}-B${b}-C${c}`);
            if (b === 2 && c === 1) {
                continue LABEL;
            }
        }
    }
}

// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1
// A2-B1-C1
// A2-B1-C2
// A2-B1-C3
// A2-B2-C1

この例では2番目のループ(loopB)が2、3番目のループ(loopC)が1のときに1番目のループ(loopA)の残りの処理をスキップして次のループへ移っています。

6. ラベルを使用したbreak

次は先ほどのcontinueと同じ位置、同じ条件でbreakを使用してみます。

const loopA = [1, 2];
const loopB = [1, 2];
const loopC = [1, 2, 3];

LABEL:for (const a of loopA) {
    for (const b of loopB) {
        for (const c of loopC) {
            console.log(`A${a}-B${b}-C${c}`);
            if (b === 2 && c === 1) {
                break LABEL;
            }
        }
    }
}

// 出力結果↓↓
// A1-B1-C1
// A1-B1-C2
// A1-B1-C3
// A1-B2-C1

条件を満たすことでラベルをつけたloopAがbreakされ、それ以降の処理が実行されなくなります。

7. まとめ

今回のような単純な例でも「どこのループだっけ?」と可読性が落ちているように感じました。
ラベルの使い方を理解しておくことでループの扱い方の幅が広がるかと思います。

17
7
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7