条件分岐の「多分岐」とは
C#のif文は、条件が真(true)か偽(false)かの2択(if-else)だけでなく、3つ以上の複数の選択肢から処理を分岐させることも可能です。
例えば、「Aの場合は処理1、AではないがBの場合は処理2、どちらでもない場合は処理3」といった複雑な条件分岐を実現するのがelse if構文です。
この記事では、if-else if-else構文の基本的な使い方と、特に注意すべき点について解説します。
if-else if-else の基本構文
else ifは、if文とelse文の間に記述し、複数の条件を追加するために使用します。
if (条件式 1)
{
// 条件式 1 が true の場合に実行される処理
}
else if (条件式 2)
{
// 条件式 1 が false で、かつ 条件式 2 が true の場合に実行される処理
}
else if (条件式 3)
{
// 条件式 1 と 2 が false で、かつ 条件式 3 が true の場合に実行される処理
}
else
{
// 上記のどの条件も false だった場合に実行される処理
}
この構文では、条件は上から順に評価されます。 trueになるifまたはelse ifブロックが見つかると、そのブロック内の処理が実行され、その後、このif-else if構文全体の処理から抜け出します。
else if のコード例
ここでは、学生のテストの点数(score)に基づいて成績(grade)を判定する例を示します。
using System;
public class GradeEvaluation
{
public static void Main()
{
int score = 85; // 判定対象の点数
string grade = ""; // 評価を格納する変数
if (score >= 90)
{
grade = "A (優)";
}
else if (score >= 75)
{
grade = "B (良)";
}
else if (score >= 60)
{
grade = "C (可)";
}
else
{
grade = "D (不可)";
}
Console.WriteLine($"点数: {score}点");
Console.WriteLine($"評価: {grade}");
}
}
出力結果:
点数: 85点
評価: B (良)
処理の流れ:
score >= 90(85 >= 90)が評価され、falseです。- 次の
else if (score >= 75)(85 >= 75)が評価され、trueです。 grade = "B (良)";が実行されます。trueのブロックが見つかったため、それ以降のelse if (score >= 60)やelseは評価されずに、if構文全体が終了します。
もしelse ifがなく、すべてif文で書いていた場合、85は>= 75と>= 60の両方に該当してしまい、意図しない結果になります。複数の選択肢から必ず一つだけを選びたい場合にif-else if-elseは有効です。
重要な注意点:==(比較)と =(代入)の間違い
if文の条件式を記述する際、最も注意すべき間違いの一つが、比較演算子(==)と代入演算子(=)の混同です。
==(等価演算子): 2つの値が等しいかどうかを判定し、trueかfalseを返します。if文の条件式では通常こちらを使用します。=(代入演算子): 右辺の値を左辺の変数に代入します。
C#における挙動
他の言語と異なり、C#は型チェックが厳格であるため、int型などの変数に対して=(代入)をif文で使うと、ほとんどの場合コンパイルエラーになります。
int value = 5;
// 間違い: if (value = 0)
// これは「valueに0を代入する」という式であり、式全体の結果は(代入後の値である)int型の 0 になります。
// if文の条件式は bool型 (true/false) でなければならないため、コンパイルエラーが発生します。
if (value = 0)
{
// コンパイルエラー: 'int' を 'bool' に暗黙的に変換できません。
}
// 正しい比較
if (value == 0)
{
Console.WriteLine("value は 0 です。"); // この例では実行されない
}
bool型の場合の危険性
この間違いがバグの原因となり得るのは、扱う変数がbool型の場合です。bool型変数への代入式の結果はbool型となるため、コンパイルエラーにならず、if文が意図せずtrueと評価されてしまいます。
bool isReady = false;
// 非常に危険な間違い
// 意図: isReady が true かどうか「比較」したい
// 実際: isReady に true を「代入」し、if文の条件式も true になる
if (isReady = true)
{
// このブロックは isReady の元の値に関わらず、常に実行されてしまう
Console.WriteLine("代入が成功したため、常に実行されます。");
}
// 正しい比較
if (isReady == true) { /* ... */ }
// (推奨される書き方)
if (isReady) { /* ... */ }
まとめ
if-else if-else構文は、C#で複数の選択肢に応じた処理分岐を実装する際の基本的な手段です。
- 条件は上から順に評価され、最初に
trueになったブロックだけが実行されます。 elseブロックは、どの条件にも当てはまらなかった場合の「デフォルト処理」として機能します。- 条件式では、代入(
=)と比較(==)を絶対に混同しないよう注意が必要です。
これらのルールを理解し、正しく使用することで、プログラムのロジックを正確に制御できます。
