ifとelseの迷宮 §
"if(条件式1) if(条件式2) 実行文1 else 実行文2"と書いた時、elseは2つめのifが成立しなかった時となります。最初のifには対応しません。2番目のifにもelseがあれば最初のifに対応できます。つまり、"if(条件式1) if(条件式2) 実行文1 else 実行文2 else 実行文3"なら、最後のelseは最初のifに対応します。
では、elseを増やさないで対処する方法があるのかといえばあります。
2つめのif文を波括弧で囲えば良いのです。
"if(条件式1) { if(条件式2) 実行文1 } else 実行文2"
これでelseは最初のif文に対応するようになります。
罠の数々 §
- ifとelseを別の行にするとIDEが勝手にインデントを付けてくれることが多い。その結果、elseがどのifに対応するのかがすぐ分かる。罠に落ちやすいのは同じ行にifとelseを複数書いたときである。
参考リンク §
if-else (C# リファレンス)
ステートメント (C# プログラミング ガイド)
波括弧の説明は、実は上記のステートメントのページにある。そのページを参照して確認してみよう。
そして、波括弧の役割は通常複数の文をまとめて1つの文として扱うことにあるのだが、実は今回の事例では【1つしかステートメントを囲っていない】のである。それにも関わらず、なぜ囲ったのか理由を考えてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
ifelse §
using System;
class Program
{
static void Main()
{
// 結果が6 7 であって欲しいとき
for (int i = 0; i < 9; i++)
{
if (i > 5) if (i > 7) continue; else Console.Write($"{i} ");
}
Console.WriteLine();
// 結果が0 1 2 3 4 5 であって欲しいとき
for (int i = 0; i < 9; i++)
{
if (i > 5) { if (i > 7) continue; } else Console.Write($"{i} ");
}
Console.WriteLine();
}
}
実行結果
6 7
0 1 2 3 4 5