C++のネストされたif文を攻略!可読性を高める書き方と注意点を徹底解説
生徒
「先生、if文の中に、さらにif文を書くことはできますか?『もし雨なら、さらにもし傘を持っていたら……』みたいな条件を作りたいんです。」
先生
「もちろんです!それを『ネスト(入れ子)』と呼びます。複雑な条件を作るには欠かせない技術ですよ。」
生徒
「ネスト……なんだか鳥の巣みたいですね。でも、たくさん書くと中身がごちゃごちゃして読みづらくなりそうです。」
先生
「その感覚はとても大切です!プログラムの『読みやすさ(可読性)』を保つためのコツも一緒に学んでいきましょう。」
1. ネストされたif文とは?基本構造を学ぼう
C++のプログラミングにおけるネスト(Nest)とは、ある構造の中に同じ構造が入り込んでいる状態を指します。日本語では「入れ子構造」とも呼ばれます。if文の中にさらに別のif文を書くことで、「第一の条件をクリアした人だけが、第二の条件に挑める」という、より細かい段階的な条件分岐を作ることが可能になります。
例えば、「会員かどうか」を確認し、会員だった場合にのみ「クーポンを持っているか」を確認するといった処理です。このように条件を重ねることで、プログラムはより高度な判断ができるようになります。しかし、入れ子が深くなりすぎると、どこからどこまでが一つの塊なのかが分かりにくくなるため、注意が必要です。SEO対策としても、この「ネスト」という言葉はC++学習において非常に重要なキーワードとなります。
2. プログラミング未経験でもわかる!「遊園地の入場」で例えると
パソコンを触ったことがない方でもイメージしやすいように、遊園地のアトラクションへの入場を例に考えてみましょう。ある特別な絶叫マシンに乗るためには、二つの関門があるとします。まず第一に「身長が120センチ以上であること」、そして第二に「専用のチケットを持っていること」です。
スタッフさんは、まず身長を確認します。ここで120センチ未満なら、チケットを持っているかどうかを確認するまでもなくお断りします。身長をクリアした人だけが、次にチケットを提示する段階へ進めます。このように「前の条件をクリアしないと次の確認が行われない」という仕組みが、まさにネストされたif文の動きです。条件が段階的に絞り込まれていく様子をイメージしてみてください。
3. ネストされたif文の具体的な書き方
それでは、実際のC++のコードでどのように書くのかを見てみましょう。以下の例では、まず「点数が80点以上か」を確認し、合格だった場合に「満点(100点)かどうか」をさらに確認しています。中にあるif文は、外側のif文の波括弧{ }の中に記述します。
#include <iostream>
int main() {
int score = 100;
if (score >= 80) {
// ここは80点以上の人だけが実行されるエリア
std::cout << "合格です!" << std::endl;
if (score == 100) {
// ここは80点以上、かつ100点の人だけが実行されるエリア
std::cout << "満点おめでとうございます!" << std::endl;
}
}
return 0;
}
実行結果は以下のようになります。
合格です!
満点おめでとうございます!
もしscoreが90点なら「合格です!」だけが表示され、70点なら何も表示されません。このように、外側の条件が「偽(正しくない)」の場合は、内側の処理は一切読み飛ばされるのが特徴です。
4. 可読性(読みやすさ)を損なう「深いネスト」の恐怖
プログラミングにおいて、可読性(かどくせい)とは「人間がいかに楽にそのコードを理解できるか」という指標です。ネストは便利ですが、3重、4重と深くなっていくと、右へ右へとコードが押し出されていき、迷路のような状態になってしまいます。これを俗に「ピラミッド型」や「スパゲッティコード」と呼び、バグ(プログラムのミス)が生まれる大きな原因になります。
例えば、5重になったネストを読み解くのは、ベテランのプログラマーでも大変です。初心者のうちは「if文が3つ重なったら、もっとスッキリ書けないかな?」と疑ってみる癖をつけましょう。読みやすいコードは、自分だけでなく将来そのコードを見る他の人にとっても大きな助けとなります。
5. 論理演算子「&&」を使ってネストを解消する方法
深いネストを避けるための代表的な方法が、論理演算子(ろんりえんざんし)を使うことです。C++では、二つの条件を「かつ(AND)」で結ぶときに&&という記号を使います。これを使うと、二段階に分かれていたif文を一行にまとめることができ、見た目がとてもスッキリします。
#include <iostream>
int main() {
bool hasTicket = true; // チケットを持っている
int height = 130; // 身長130センチ
// 「身長が120以上」かつ「チケットを持っている」
if (height >= 120 && hasTicket == true) {
std::cout << "アトラクションに乗車できます!" << std::endl;
} else {
std::cout << "条件を満たしていません。" << std::endl;
}
return 0;
}
実行結果は以下のようになります。
アトラクションに乗車できます!
先ほどのネスト構造と同じ意味の処理ですが、階層が浅くなったことで、一目で条件が理解できるようになりました。このように「同時に満たすべき条件」であれば、ネストせずに論理演算子を活用するのがモダンなC++の書き方です。
6. 早期リターン(ガード句)による可読性の向上
もう一つの重要なテクニックが、早期リターンです。これは、関数の最初の方で「ダメな条件」を先にチェックして、さっさと処理を終わらせてしまう手法です。これにより、メインとなる大切な処理をネストの深い場所に隠さずに済み、左端に揃えて書くことができます。プログラミング用語では「ガード句」とも呼ばれます。
#include <iostream>
void entryCheck(int age) {
// 早期リターン:ダメな条件を先に追い出す
if (age < 18) {
std::cout << "18歳未満の方は利用できません。" << std::endl;
return; // ここで関数を終了させる
}
// メインの処理(ネストせずに書ける!)
std::cout << "ようこそ!手続きを開始します。" << std::endl;
std::cout << "書類を確認中です..." << std::endl;
}
int main() {
entryCheck(20);
return 0;
}
このように書くと、重要な「手続き開始」の処理がifの壁に囲まれず、読みやすくなります。初心者の方は、まず「条件に合わないものを先に弾く」という考え方を取り入れてみてください。
7. インデント(字下げ)の重要性とルール
ネストされたif文を書くときに絶対に忘れてはいけないのが、インデント(字下げ)です。C++では、if文の中身を書くときに半角スペース4つ分(またはTabキー1回分)右にずらして書くのがルールです。パソコン初心者の場合、このスペースを適当にしてしまいがちですが、インデントがバラバラだと、どのifがどこで終わっているのか全く分からなくなります。
最近のプログラミング用ソフト(エディタ)は、自動でこのインデントを整えてくれる機能がありますが、自分でも「一段深くなったら、右にずらす」という感覚を養いましょう。これは単なる見た目の問題ではなく、プログラムの構造を正しく把握するための、プログラマーとしての最低限のマナーでもあります。
8. 複雑な条件分岐を作る時の設計のコツ
どうしてもネストが深くなってしまいそうなときは、一度ペンと紙を持って、条件を整理してみるのも良い方法です。図に書いてみると、「実はこの条件とあの条件はまとめられるな」といった発見があります。プログラムを書く時間よりも、どう書くかを考える時間の方が大切だと言われることもあります。
C++のif文、else if文、そして今回のネストを組み合わせれば、どんな複雑なルールもプログラムで表現できます。しかし、大切なのは「動くこと」だけでなく「後で読めること」です。この記事で学んだ、論理演算子や早期リターンを武器に、誰が見ても美しい条件分岐を作れるようになりましょう。基礎を固めることが、将来の複雑なアプリケーション開発への一番の近道です。