条件演算子 単語


ニコニコ動画で条件演算子の動画を見に行く

ジョウケンエンザンシ

3.5千文字の記事
これはリビジョン 2746441 の記事です。
内容が古い・もしくは誤っている可能性があります。
最新版をみる

条件演算子(conditonal operator)とは、条件によって違う値を返すための演算子である。三項演算子(ternary operator)とも言う。

概要

演算子とは"1 + 2"でいえば"+"のことである。この場合、オペランド(: operand. 被演算数。左記の"1", "2"のこと)が2つなので二項演算子(binary operator)に分類される。

条件演算子は、「条件」「真式(条件が真の時の値)」「偽式(条件が偽の時の値)」をオペランドにとり、条件(の計算結果)が真の時は、真式を評価(計算)した結果を返し、条件が偽の時は、偽式を評価した結果を返す演算子である。

オペランドが3つなので三項演算子ということになる。ちなみに、"i++"のようにして使うインクリメント"++"や、"-a"のように数値の正負を反転させる"-"はオペランドが1つなので単項演算子(unary operator)という分類になる。

条件演算子を採用している代表的なプログラミング言語であるC言語、Javaなどでは、

 条件 ? 真式 : 偽式

という形をとる。

"+"や"="などと異なり、プログラミングでしか出てこない記号なので、使うとプログラミングをしているという実感が湧き厨二心がくすぐられる。

三項演算子という名称について

条件演算子を最初に普及させたC言語において、条件演算子は唯一の三項演算子であったため、条件演算子のことを三項演算子と呼ぶことも多い。三項演算子という、聞いただけでは機能を想像できない名前もまた厨二心をくすぐるのである。

その後の歴史のおいても条件演算子以上に汎用性の高い三項演算子が普及することはなかったため、三項演算子と言えば条件演算子を指す状況は継続している。

短絡評価

関数の引数はすべて関数に渡される前に評価されるが、条件演算子のオペランドの真式・偽式は条件に合致した方しか評価されない。

たとえば、条件に合致せず評価されなかった方にプログラムがハングアップするようなコードが入っていても動作には何の影響もない。

この性質は短絡評価と呼ばれ、他にはand, orなどの論理演算に見られる。一種の遅延評価と見ることもできる。

分岐フロー制御に使える?

プログラミング言語で条件分岐フローを実現するには基本的にif文を用いる。しかし条件演算子の使えるプログラミング言語では、条件演算子の値を返すという性質を無視して、if文を用いた分岐フロー制御の代わりに条件演算子を使用できなくもない。

言語設計者の裏をかいたような気分になって厨二心をくすぐられるかもしれないが、良い子は真似をしてはいけない。ワンライナーとかを目指しているのでなければ、フロー制御に if が使える言語では素直に if を使うべきである。

サンプルコード

歴史的なことを考えるならC言語の例をあげるべきかもしれないが、編集者の都合によりJavaのサンプルを掲載する。

import java.util.Random;

public class TernarySample {
public static void main(String[] args) {
Random random = new Random();
// 0か1をランダムに返す。
int n = random.nextInt(2);

// if文を用いる書き方。
if (n == 0) {
System.out.println("丁");
} else {
System.out.println("半");
}

// 条件演算子を用いればif文より短く1行で書ける。
n = random.nextInt(2);
System.out.println(n == 0 ? "丁" : "半");

// if文の代わりに無理矢理使ってみた例。
n = random.nextInt(2);
Void v = n == 0 ? print("丁") : print("半");
}

/** System.out.println()はオペランドになれないので. */
private static Void print(String s) {
System.out.println(s);
return null;
}
}

if文ではSystem.out.println()を2回書いているが、条件演算子を用いるとSystem.out.println()を1回書くだけで済んでいる。

可読性の問題

条件演算子は使うとかっこよくなった気分にひたれるのだが、見慣れない記号であること (や、改行を入れて使用することが想定されていないこと)から、可読性が悪くなると言われている。概要のサンプルコードのような自然に1行におさまる単純な例ではむしろ可読性が上がるのだが、特にオペランドの式が長くなったときや、条件演算子をネスト(入れ子に)した場合には可読性の悪化が顕著に表面化する。

可読性のために組織内のコーディング規約で条件演算子のネストを禁止したり、使用を制限したりする場合もある。

条件分岐といえばFizzBuzz。

public class FizzBuzz {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
String s = fizzBuzz(i);
// fizzBuzz()とternaryFizzBuzz()が等価であることの確認。
if (!s.equals(ternaryFizzBuzz(i))) {
throw new Error("fizzBuzz()とternaryFizzBuzz()が等価でありません。");
}
System.out.println(s);
}
}

/** if文を用いた例. */
private static String fizzBuzz(int input) {
if (input % 15 == 0) {
return "FizzBuzz";
} else if (input % 5 == 0) {
return "Buzz";
} else if (input % 3 == 0) {
return "Fizz";
} else {
return Integer.toString(input);
}
}

/** 条件演算子をネストした例. */
private static String ternaryFizzBuzz(int input) {
return input % 15 == 0 ? "FizzBuzz" : (input % 5 == 0) ? "Buzz" : (input % 3 == 0) ? "Fizz" : Integer.toString(input);
}
}

各言語の条件演算

上記可読性の問題を意識してか、同様のことを実現するのに演算子(記号)ではなく式(expression)という形を取る言語もある。

C言語, Java, Ruby

概要で述べた通り、以下の書式である。

 条件 ? 真式 : 偽式

Scala, Kotlin

ScalaやKotlinでは、「if文」ではなく値を返す「if式」とすることで、分岐フロー制御と条件演算子の機能を一本化した。

if (条件) {真式} else {偽式}

Python

Pythonはソースコードの可読性の高さを売りにしているため、条件演算子の導入が長い間見送られてきた。バージョン2.5からようやく導入されたが、演算子ではなく「条件式 (Conditional Expressions)」という「式」になっている。

他言語の条件演算とは、「条件」の位置が異なっている。

真式 if 条件 else 偽式

Python3のコードを以下に記す。Pythonのif文では改行が必須だが条件式を使えば1行で記述できる。

print("1...Aレース / それ以外...Bレース")
s = input()

print("Aレース選択" if s == "1" else "Bレース選択")

なお、値を返すという性質を無視して分岐フロー制御として用いると、黄色の部分は以下のように書くことができるが、良い子は真似をしてはいけない。

print("Aレース選択") if s == "1" else print("Bレース選択")

LISP

LISPでは、if はフロー制御をするとともに、値を返す条件演算子の機能も兼ねている(短絡評価があるので関数ではないと思う)。そういう意味ではScalaやKotlinは先祖返りしたとも言える。if でなく cond(ition) という命令を定義する場合もあるが、ここでは触れない。

(if 条件 真式 偽式)

関連動画

関連リンク

関連項目

  • C言語
  • if
  • ワンライナー
  • 短絡評価 / 遅延評価
  • 厨二病
  • プログラミング関連用語の一覧
タグでニコニコ動画を検索

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
もっと見る

急上昇ワード改

最終更新:2025/12/07(日) 02:00

ほめられた記事

最終更新:2025/12/07(日) 02:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP