1. ネストされたifの基本構文
リアルな場面で、判断が一つの条件だけで決まることってあんまりないよね。たいてい複数の条件を同時にチェックするし、それらはお互いに依存してることも多い。例えば、コンサートに行くには大人であるだけじゃ足りなくて、招待リストに載ってる必要がある場合もある。こういう時に登場するのが、いわゆる多段階ロジックで、それを助けてくれるのがネストされたif文なんだ。
ネストされた条件っていうのは、あるifの中にさらに別のifが入ってる状態。箱の中に箱があるイメージだね:最初の箱が開いた(条件がtrueになった)ら、中身を見て、さらにもう一つ箱を開けるかも。コードとロジック的には、これってかなり強力なツールだよ。
まずはシンプルな例から:
if (条件A)
{
// 条件Aがtrue(真)のときの処理
if (条件B)
{
// 両方の条件が真のときの処理
}
}
これ、マトリョーシカを思い出したら正解!外側のifが通ったときだけ、中のネストされたifが実行されるよ。
例:クラブへの入場
前にユーザーが名前と年齢を入力するアプリを作ったよね。今度はチェックをもう一段追加しよう:例えば、クローズドなクラブに入るには21歳以上かつ招待コードが必要、みたいな感じ。
Console.Write("あなたの名前を入力してください: ");
string name = Console.ReadLine();
Console.Write("あなたの年齢を入力してください: ");
int age = int.Parse(Console.ReadLine());
if (age >= 21)
{
Console.Write("招待コードを入力してください: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("ようこそ、" + name + "さん、VIPクラブへ!");
}
else
{
Console.WriteLine("ごめん、コードが間違ってる。入場できません。");
}
}
else
{
Console.WriteLine("ごめん、21歳からしか入れないよ!");
}
ポイント:内側のifは、年齢チェックを通った場合だけコードを確認する。これでリソースも節約できるし(警備員もイライラしない)。
2. ネストの深さはどこまでOK?
技術的には、いくらでもネストできる。でも実際は、ネストが深くなればなるほどコードが読みにくくなるし、メンテも大変。現場では2〜3段くらいまでが普通。もしifが4段以上の「はしご」になってたら、ロジックをもっとシンプルにできないか、あるいは一部を関数に分けられないか考えてみて(それはまた別のレクチャーで!)。
3. ネストされたifとelse:落とし穴とコツ
初心者あるある:波括弧の書き方が雑。
ネストした条件を書くとき、特にelseを使う場合、C#はシンタックスのルールに超厳しい。波括弧{}を付けないと、ifやelseの直後の1行だけが対象になる。これがバグの温床なんだよね。
ミスしやすい例:
if (age >= 21)
if (code == "VIP2024")
Console.WriteLine("ようこそ!");
else
Console.WriteLine("コードが違うよ。");
多くの人はelseが年齢チェックに対応してると思うけど、実は直前のif(招待コードのチェック)にくっついてる。だから、思った通りにメッセージが出ないことも。波括弧は必ず付けよう—中身が1行でもね!
誤解を避けるためにもう一度。コンパイラは上のコードをこう解釈するよ:
if (age >= 21)
{
if (code == "VIP2024")
Console.WriteLine("ようこそ!");
else
Console.WriteLine("コードが違うよ。");
}
大事なことなので繰り返す!
if-else構文で波括弧がないと、elseは直前(いちばん近い)のifにくっつくよ。
4. 代替案:ネスト内のelse if
外側のifの中で、追加の条件だけじゃなくて、別の選択肢も用意したいときがあるよね。例えば、招待コードが違ったらチケット購入を提案する、みたいな。これはネストしたelse if/elseで書ける:
if (age >= 21)
{
Console.Write("招待コードを入力してください: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("クラブへようこそ!");
}
else if (code == "GUEST")
{
Console.WriteLine("ゲストモード:23:00まで入場OK。");
}
else
{
Console.WriteLine("残念、入場できません。");
}
}
else
{
Console.WriteLine("21歳からしか入れないよ。");
}
この例では、VIPコード・ゲストコード・拒否の3パターンをネストで分岐してる。
5. 実践:多段階ロジックの割引計算アプリ
こんなアプリを書いてみよう:ユーザーの年齢とクラブカードの有無で、ショップの割引率を決めるやつ。
- ユーザーの年齢が60以上なら、割引は15%。
- 年齢がそれ未満で、クラブカードを持っていれば7%。
- それ以外は割引なし。
どう書く?
Console.Write("あなたの年齢を入力してください: ");
int age = int.Parse(Console.ReadLine());
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
Console.Write("クラブカードを持っていますか(はい/いいえ)? ");
string hasCard = Console.ReadLine();
if (hasCard == "はい")
{
discount = 0.07;
}
}
Console.WriteLine("あなたの割引率: " + (discount * 100) + "%");
ここでは、elseの中にネストしたifを使ってる。年齢が条件に合わなかったときだけ、カードを持ってるか聞くようにしてるよ。
GO TO FULL VERSION