0Pricing
C++ Academy · レッスン

早期return、break、continue、goto

早期returnでネストした条件分岐を整理し、break、continue、gotoを適切に使います。

「早期return、break、continue、goto」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

破滅のピラミッド

条件分岐が深く入れ子になると、読みにくくなります。早期 return によって、構造を大幅に平坦化できます。

// Pyramid
int process(int n) {
    if (n >= 0) {
        if (n < 100) {
            if (isValid(n)) {
                return compute(n);
            }
        }
    }
    return -1;
}

早期 return によるリファクタリング

前提条件が満たされない場合は、すぐに処理を中断してください。各ガード節を1行で平坦に記述できます。

int process(int n) {
    if (n < 0)      return -1;
    if (n >= 100)   return -1;
    if (!isValid(n)) return -1;
    return compute(n);
}

ガード節

ガード節は、関数の冒頭で無効な入力を拒否します。これにより、正常系の処理が明確になります。

ループ内の break

探しているものが見つかったときや、エラーによって処理を続ける意味がなくなったときは、ループを終了してください。

continue:残りをスキップする

continue を使うと、該当しないケースをスキップし、本体の残りを入れ子にせずに済みます。

for (auto& item : items) {
    if (item.skipped) continue;
    process(item);
}

入れ子のループから抜ける

break は1つのレベルだけを終了します。複数レベルから抜けるには、フラグを使う、関数に切り出す、または最後の手段として goto を使用してください。

bool found = false;
for (int i = 0; i < n && !found; ++i) {
    for (int j = 0; j < m; ++j) {
        if (grid[i][j] == target) {
            found = true;
            break;
        }
    }
}

goto文

C++ は C から goto を継承しています。現代のコードで必要になることはほとんどありませんが、入れ子のループやエラーパスから抜けるという正当な用途が1つあります。

for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
        if (error_condition) goto cleanup;
    }
}

cleanup:
free_resources();

goto が推奨されない理由

任意の場所へのジャンプがあると、制御フローを追いにくくなります。まずはリファクタリングやフラグを検討してください。低レベルコードのまれなクリーンアップ処理に限って goto を使用します。

goto を使わないリファクタリング

ほとんどの goto は、次の方法で置き換えられます。

  • 内側のブロックを関数に切り出す
  • フラグ変数を使用する
  • 例外をスローしてキャッチする

デストラクタ内の return

デストラクタの先頭に return; を記述して早期 return することはできません。デストラクタは値を返さないためです。ただし、早期条件を使って処理をスキップする構造にはできます。

単一出口スタイル(旧来の方法)

古いコードでは、末尾に1つだけ return を置き、結果変数を使うことがありました。現代の C++ では、分かりやすさのために複数の早期 return が好まれます。クリーンアップは RAII が自動的に処理します。

理解度チェック

関数内の入れ子になった if-else の連鎖を最もすっきり置き換えられる制御フロー技法はどれですか?

まとめ

早期 returnをガード節として使用し、意図を明確にするために break と continue は控えめに使用してください。goto は、入れ子のループやクリーンアップ処理から抜ける、まれなケースに限ります。目標は、読みやすく平坦な制御フローです。

よくある質問

「早期return、break、continue、goto」レッスンは無料ですか?

はい。「早期return、break、continue、goto」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「早期return、break、continue、goto」で何を学びますか?

早期returnでネストした条件分岐を整理し、break、continue、gotoを適切に使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「早期return、break、continue、goto」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 分岐:if-else、三項演算子、switch-case
  2. ループのパターン:for、while、do-while
  3. コンテナでの範囲ベースforループ
  4. 早期return、break、continue、goto
← C++ Academyに戻る