Unity & C# 学習教材

条件演算子と式・文(補足)

if 文の次に学ぶ ? : 演算子(条件演算子)は、if と似ていますが根本的に異なります。その違いを理解するには「式(expression)」と「文(statement)」の区別が欠かせません。

学習目標

前提知識


1. 式と文

式(expression)— 値になるもの

とは、評価すると値が得られるコードのことです。

1
2
3
4
3 + 2        // 値: 5
score * 0.8  // 値: score の 80%
"Hello"      // 値: "Hello" という文字列
true         // 値: true

式は値を持つので、変数に代入したりメソッドに渡したりできます。

1
2
int result = 3 + 2;           // 式 3+2 を変数に代入
Console.WriteLine(score * 2); // 式 score*2 をメソッドに渡す

文(statement)— 処理を行うもの

とは、処理を実行するコードのことです。文は値を持ちません。

1
2
3
int score = 100;     // 変数宣言文
score = 200;         // 代入文
Console.WriteLine(); // 式文(メソッド呼び出しを文として使う)

if は文

if は「処理を実行する」構造であり、です。値を持ちません。

1
2
// ❌ NG: if は値を持たないので代入できない
var label = if (score >= 60) { "合格" } else { "不合格" };

このようなコードは C# では書けません。if で条件によって変数に値を入れたい場合は、次のように書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
int score = 75;
string label;

if (score >= 60)
{
    label = "合格";
}
else
{
    label = "不合格";
}

Console.WriteLine(label);  // 合格

これは正しく動きますが、「条件によって値を選ぶ」という目的に対してコードが長くなります。


2. 条件演算子

書式:条件演算子

1
条件式 ? 真のときの値 : 偽のときの値
要素 説明
条件式 bool 型になる式
真のときの値 条件式が true のとき、この式の値が全体の値になる
偽のときの値 条件式が false のとき、この式の値が全体の値になる

条件演算子全体が1 つの式になり、値を持ちます。

1
2
3
4
int score = 75;
string label = score >= 60 ? "合格" : "不合格";

Console.WriteLine(label);  // 合格

score >= 60true なので "合格" が選ばれ、label に代入されます。

if 文との比較で見ると、書いている内容はまったく同じです。

1
2
3
4
5
6
7
8
9
// if 文バージョン(文)
string label;
if (score >= 60)
    label = "合格";
else
    label = "不合格";

// 条件演算子バージョン(式)
string label = score >= 60 ? "合格" : "不合格";

メソッドの引数に直接渡す

条件演算子は式なので、値が期待される場所ならどこにでも書けます。

1
2
int score = 40;
Console.WriteLine(score >= 60 ? "合格" : "不合格");  // 不合格

3. if 文と条件演算子の使い分け

  if 条件演算子 ? :
種別 文(値なし) 式(値あり)
目的 処理の切り替え 値の選択
複数行の処理 ✅ 得意 ❌ 向かない
値として使う ❌ できない ✅ できる

条件演算子が向いている場面 — 「条件によって値を選ぶ」だけの場合

1
2
3
// ✅ シンプルで読みやすい
string message = isLoggedIn ? "ようこそ" : "ログインしてください";
int abs = x >= 0 ? x : -x;  // 絶対値

if 文が向いている場面 — 分岐内で複数の処理が必要な場合

1
2
3
4
5
6
7
8
9
10
11
12
// ✅ 処理が複数あるので if 文が適切
if (score >= 60)
{
    Console.WriteLine("合格");
    SendCertificate();
    UpdateDatabase();
}
else
{
    Console.WriteLine("不合格");
    SendRetryNotice();
}

よくあるミス

真・偽の値の型が一致していない

1
2
3
4
5
// ❌ NG: int と string は型が違うのでコンパイルエラー
var result = score >= 60 ? 1 : "不合格";

// ✅ OK: 両方 string に揃える
string result = score >= 60 ? "合格" : "不合格";

条件演算子の真・偽の値は型が一致している必要があります。


まとめ


理解度チェック

  1. 次の式の値は何になりますか?

    1
    2
    
    int x = 10;
    string result = x % 2 == 0 ? "偶数" : "奇数";
    
  2. 次のコードを条件演算子 1 行で書き直してください。

    1
    2
    3
    4
    5
    6
    
    int score = 85;
    string grade;
    if (score >= 70)
        grade = "合格";
    else
        grade = "不合格";
    
  3. 次のコードはコンパイルエラーになります。なぜですか?

    1
    2
    
    int value = 5;
    var result = value > 0 ? "正" : 0;
    
解答を見る
  1. "偶数"10 % 2 == 0true なので左側の "偶数" が選ばれる。

  2. 1
    
    string grade = score >= 70 ? "合格" : "不合格";
    
  3. 真のときの値 "正"string 型、偽のときの値 0int 型で、型が一致していないためコンパイルエラーになる。

次のステップ

反復処理 では、forwhile を使った繰り返し処理を学びます。