早期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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 分岐:if-else、三項演算子、switch-case
- ループのパターン:for、while、do-while
- コンテナでの範囲ベースforループ
- 早期return、break、continue、goto