プログラムは状況に応じて動作を変える必要があります。
C#のif
文は、その判断を行うための基礎となる構文です。
本記事では、基本のifからelse/else ifまでを、初心者の方にも分かりやすい具体例とサンプルコードで丁寧に解説します。
比較演算子や論理演算子の使い方、よくあるミスの回避方法まで網羅します。
C#の条件分岐(if-else)とは?
条件分岐の基本と真偽値
プログラムが「条件が成り立つときだけ何かをする」ための仕組みが条件分岐です。
条件の評価結果は真偽値(true
かfalse
)で表され、if
文はこの結果に基づき実行するブロックを選びます。
真ならブロックを実行し、偽ならスキップする、という単純かつ強力なルールです。
よく使う場面のイメージ
ログインしているかどうかで表示を切り替える、スコアに応じてランクを判定する、在庫が0かどうかで購入ボタンの有効・無効を切り替えるなど、アプリのあらゆる場面で利用します。
現実世界の「もし雨なら傘を持つ」に相当する考え方です。
用語の確認(if, else, else if)
if
: 条件がtrue
のときに実行する部分を定義します。else
: 上記if
がfalse
だったときの代替処理を定義します。else if
: 「最初のif
がfalse
のとき、別の条件をさらに評価する」ための追加分岐です。複数回つなげられます。
if文の基本構文(書き方とサンプル)
基本形(if)の構文
C#のif
は、必ず丸括弧内に真偽値に評価される式を書き、その後に波括弧で囲んだブロックを続けます。
// 基本のif構文
// 条件(丸括弧)がtrueのとき、波括弧の中が実行されます。
using System;
class Program
{
static void Main()
{
int temperature = 30;
if (temperature >= 28) // 28度以上なら暑いと判定
{
Console.WriteLine("暑いです。熱中症に注意しましょう。");
}
Console.WriteLine("プログラムは終了しました。");
}
}
暑いです。熱中症に注意しましょう。
プログラムは終了しました。
ブロック({})とインデント
波括弧{ }
は実行される文のまとまりを示します。
1行だけの処理でも波括弧を付けると、将来の修正時に安全です。
インデント(字下げ)を整えることで、どこからどこまでが条件の範囲かが明確になります。
using System;
class Program
{
static void Main()
{
bool isMember = true;
// 良い例: 常に波括弧を付け、インデントで構造を明確にする
if (isMember)
{
Console.WriteLine("会員特典を適用します。");
Console.WriteLine("ポイントを加算しました。");
}
// 悪い例: 波括弧を省略すると、後から行を追加したときにバグになりやすい
if (isMember)
Console.WriteLine("会員特典を適用します。");
// ここに処理を追加しても、ifの外として実行されてしまう
}
}
会員特典を適用します。
ポイントを加算しました。
会員特典を適用します。
比較演算子(==, !=, <, >, <=, >=)
値どうしを比べるための記号です。
結果はtrue
またはfalse
になります。
演算子 | 読み方(例) | 説明 | 例 | 結果 |
---|---|---|---|---|
== | イコール | 等しい | 5 == 5 | true |
!= | ノットイコール | 等しくない | 5 != 3 | true |
< | より小さい | 左が右より小 | 3 < 5 | true |
> | より大きい | 左が右より大 | 7 > 10 | false |
<= | 以下 | 小さいまたは等しい | 5 <= 5 | true |
>= | 以上 | 大きいまたは等しい | 8 >= 9 | false |
論理演算子(&&, ||, !)
複数の条件を組み合わせます。
短絡評価(左で結果が決まれば右を評価しない)を行います。
演算子 | 読み方 | 説明 | 例 | 結果 |
---|---|---|---|---|
&& | かつ(AND) | 両方がtrue ならtrue | (age >= 18) && isMember | 両方満たすときのみtrue |
|| | または(OR) | どちらかtrue ならtrue | isHoliday || isWeekend | 片方でもtrue |
! | 否定(NOT) | 真偽を反転 | !isEmpty | false ならtrue |
数値の例(サンプルコード)
年齢から成人かどうかを判定する基本例です。
using System;
class Program
{
static void Main()
{
int age = 20;
if (age >= 18)
{
Console.WriteLine("18歳以上です。");
}
if (age >= 20)
{
Console.WriteLine("日本の民法上の成人(18歳以上)は満たしています。");
Console.WriteLine("お酒・たばこは20歳以上で可能です。");
}
}
}
18歳以上です。
日本の民法上の成人(18歳以上)は満たしています。
お酒・たばこは20歳以上で可能です。
文字列の例(サンプルコード)
文字列の等価比較は==
で行えます。
大文字・小文字を区別せずに比較したい場合はStringComparer.OrdinalIgnoreCase
などを使うと安全です。
using System;
class Program
{
static void Main()
{
string answer = "Yes";
// 大文字・小文字を区別する比較
if (answer == "Yes")
{
Console.WriteLine("その通りです。(大小区別あり)");
}
// 大文字・小文字を区別しない比較
if (StringComparer.OrdinalIgnoreCase.Equals(answer, "yes"))
{
Console.WriteLine("その通りです。(大小区別なし)");
}
// 空文字やnullのチェックを合わせる例
if (!string.IsNullOrWhiteSpace(answer))
{
Console.WriteLine("回答が入力されています。");
}
}
}
その通りです。(大小区別あり)
その通りです。(大小区別なし)
回答が入力されています。
boolの例(サンプルコード)
フラグ(真偽値)はそのまま条件に書けます。
比較せずに直接使うのが読みやすい書き方です。
using System;
class Program
{
static void Main()
{
bool isDebug = true;
// 良い例: フラグをそのまま使う
if (isDebug)
{
Console.WriteLine("デバッグモードです。詳細ログを出力します。");
}
// 不要な比較の例: if (isDebug == true) は冗長
if (isDebug == true)
{
Console.WriteLine("この行は冗長な比較をしています。");
}
// 否定の例
bool isEmpty = false;
if (!isEmpty)
{
Console.WriteLine("空ではありません。");
}
}
}
デバッグモードです。詳細ログを出力します。
この行は冗長な比較をしています。
空ではありません。
else/else ifの使い方(分岐の増やし方)
elseの基本(どれにも当てはまらない場合)
if
がfalse
のとき実行するブロックをelse
で定義します。
いずれか一方だけが必ず実行される構造になります。
using System;
class Program
{
static void Main()
{
int stock = 0;
if (stock > 0)
{
Console.WriteLine("在庫あり。購入可能です。");
}
else
{
Console.WriteLine("在庫なし。入荷をお待ちください。");
}
}
}
在庫なし。入荷をお待ちください。
else ifの基本(複数条件)
複数の条件を順に試したいときはelse if
を重ねます。
最初にtrue
になったブロックだけが実行され、それ以降は評価されません。
using System;
class Program
{
static void Main()
{
int score = 72;
if (score >= 90)
{
Console.WriteLine("評価: A");
}
else if (score >= 80)
{
Console.WriteLine("評価: B");
}
else if (score >= 70)
{
Console.WriteLine("評価: C");
}
else
{
Console.WriteLine("評価: D");
}
}
}
評価: C
多段分岐の書き方(サンプルコード)
年齢に応じて料金区分を判定する例です。
条件は広い範囲から狭い範囲へ、あるいは上から順に排他的になるように並べると分かりやすいです。
using System;
class Program
{
static void Main()
{
int age = 65;
if (age < 6)
{
Console.WriteLine("未就学(無料)");
}
else if (age < 13)
{
Console.WriteLine("小人料金");
}
else if (age < 65)
{
Console.WriteLine("大人料金");
}
else
{
Console.WriteLine("シニア割引");
}
}
}
シニア割引
条件の順番と評価の流れ
上から順に評価され、いずれかがtrue
になった時点で打ち切りです。
副作用のある関数呼び出しや計算コストの高い判定は、後ろに回すと効率的です。
次のコードで、ログ出力の回数に注目してください。
using System;
class Program
{
static void Main()
{
int value = 10;
if (IsLarge(value))
{
Console.WriteLine("Large");
}
else if (IsMedium(value))
{
Console.WriteLine("Medium");
}
else
{
Console.WriteLine("Small");
}
}
static bool IsLarge(int x)
{
Console.WriteLine("IsLargeを評価");
return x >= 100;
}
static bool IsMedium(int x)
{
Console.WriteLine("IsMediumを評価");
return x >= 50;
}
}
IsLargeを評価
IsMediumを評価
Small
この例ではIsLarge
がfalse
のためIsMedium
も評価されました。
もし最初の条件がtrue
ならIsMedium
は評価されません。
ネストのifと可読性
入れ子(ネスト)が深いと読みにくくなります。
早期returnや条件の反転でフラットに保つと可読性が上がります。
using System;
class Program
{
static void Main()
{
Console.WriteLine(Validate(25, true));
Console.WriteLine(Validate(15, true));
}
// 悪い例: ネストが深い
static string ValidateNested(int age, bool hasConsent)
{
if (age >= 18)
{
if (hasConsent)
{
return "OK";
}
else
{
return "同意が必要です";
}
}
else
{
return "年齢条件を満たしていません";
}
}
// 良い例: 早期returnでフラットに
static string Validate(int age, bool hasConsent)
{
if (age < 18) return "年齢条件を満たしていません";
if (!hasConsent) return "同意が必要です";
return "OK";
}
}
OK
年齢条件を満たしていません
よくあるミスと注意点(if文)
=と==の違い(代入と比較)
代入=
と比較==
は別物です。
C#では多くの場合、条件式での誤代入はコンパイルエラーになりますが、左辺がbool
変数だと成立してしまい、バグの原因になります。
using System;
class Program
{
static void Main()
{
bool isOk = false;
// 誤り: 代入してしまっているため、常にtrueになる
if (isOk = true) // 警告: ここでisOkにtrueを代入している
{
Console.WriteLine("常に実行されます(バグ)");
}
// 正しい: 比較には==
isOk = false;
if (isOk == true)
{
Console.WriteLine("isOkがtrueのときだけ実行");
}
// さらに良い書き方: 直接フラグを使う
if (isOk)
{
Console.WriteLine("簡潔で安全な書き方");
}
}
}
常に実行されます(バグ)
boolを条件に使うときはそのまま書く(例: if (isOk)
)のが安全です。
セミコロンの付け方に注意
ifの直後にセミコロン;
を置くと、意図せず空の文になり、後続のブロックが常に実行されます。
using System;
class Program
{
static void Main()
{
int n = 5;
// 誤り: ここでif文が終わっている
if (n > 10);
{
Console.WriteLine("この行は常に実行されてしまいます(バグ)");
}
// 正しい
if (n > 10)
{
Console.WriteLine("nは10より大きいです");
}
}
}
この行は常に実行されてしまいます(バグ)
条件を短く分かりやすく
条件が複雑になるほど誤読やバグが増えます。
適切な変数名で意図を表す補助変数を作ると読みやすくなります。
using System;
class Program
{
static void Main()
{
int age = 22;
bool hasStudentId = true;
bool isWeekend = false;
// 読みにくい
if ((age < 25 && hasStudentId) || (age <= 18 && !isWeekend))
{
Console.WriteLine("割引対象です");
}
// 読みやすくリファクタリング
bool isStudentDiscount = age < 25 && hasStudentId;
bool isYouthWeekendException = age <= 18 && !isWeekend;
if (isStudentDiscount || isYouthWeekendException)
{
Console.WriteLine("割引対象です");
}
}
}
割引対象です
マジックナンバーを避ける
意味の分からない生の数値(マジックナンバー)は、定数にして名前で意図を表現します。
using System;
class Program
{
const int AdultAge = 18;
const int LegalDrinkingAgeInJapan = 20;
static void Main()
{
int age = 19;
if (age >= AdultAge)
{
Console.WriteLine("成人です");
}
if (age >= LegalDrinkingAgeInJapan)
{
Console.WriteLine("飲酒可能です");
}
else
{
Console.WriteLine("飲酒は不可です");
}
}
}
成人です
飲酒は不可です
範囲チェックのコツ(>=と<=)
範囲は端を含むのか含まないのかを明確にし、重複や抜け漏れがない順番で書きます。
下から上へ、または上から下へ一貫して並べると安全です。
using System;
class Program
{
static void Main()
{
int score = 80;
// 一貫した範囲: [90,∞) / [80,90) / [70,80) / (-∞,70)
if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 80) // ここは [80,90)
{
Console.WriteLine("B");
}
else if (score >= 70) // ここは [70,80)
{
Console.WriteLine("C");
}
else
{
Console.WriteLine("D");
}
}
}
B
「以上/未満」を組み合わせ、上から順に条件を削っていくと、重複や取りこぼしを避けられます。
まとめ
本記事では、C#のif
文の基本からelse
、else if
までを、比較・論理演算子とともに解説しました。
波括弧を省略しない、条件を簡潔にする、順番を意識して評価を設計するといった実践的な注意点を守ることで、読みやすくバグの少ないコードになります。
今回扱わなかったswitchや各種ループなどの他の制御構文は別記事で詳しく取り上げます。
まずは本記事のサンプルを動かし、条件分岐の感覚を手に馴染ませることから始めてみてください。