条件演算子(conditonal operator)とは、条件によって違う値を返すための演算子である。三項演算子(ternary operator)とも言う。
演算子とは"1 + 2"における"+"のことである。この場合、オペランド(: operand. 被演算数。左記の"1", "2"のこと)が2つなので二項演算(binary operator)に分類される。
条件演算子は、「条件」「真式(条件が真の時の値)」「偽式(条件が偽の時の値)」をオペランドにとり、条件(の計算結果)が真の時は、真式を評価(計算)した結果を返し、条件が偽の時は、偽式を評価した結果を返す演算子である。
オペランドが3つなので三項演算子に分類される。ちなみに、"i++"のようにして使うインクリメント"++"や、"-a"のように数値の正負を反転させる"-"はオペランドが1つなので単項演算子(unary operator)と呼ばれる。
採用している代表的なプログラミング言語であるC言語、Javaなどでは、
条件 ? 真式 : 偽式
という形をとる。
"+"や"="などと異なり、プログラミングでしか出てこない記号なので、使うとプログラミングをしているという実感が湧き厨二心をくすぐる。
条件演算子を最初に普及させたC言語において、条件演算子は唯一の三項演算子であったため、条件演算子のことを三項演算子と呼ぶことも多い。その後の歴史のおいても条件演算子以上に汎用性の高い三項演算子が普及することはなかったため、三項演算子と言えば条件演算子を指す状況は継続している。
歴史的なことを考えてもC言語の例をあげるべきとは思うが、編集者の都合によりJavaのサンプルを掲載する。
import java.util.Random;
public class TernarySample {
public static void main(String[] args) {
Random r = new Random();
// 0か1をランダムに返す。
int n = r.nextInt(2);
// if文を用いる書き方。
if (n == 0) {
System.out.println("丁");
} else {
System.out.println("半");
}
// 条件演算子を用いれば変数nを宣言せずに書ける。
System.out.println(r.nextInt(2) == 0 ? "丁" : "半");
// if文の代わりに無理矢理使ってみた例(後述)。
n = r.nextInt(2);
Void v = n == 0 ? print("丁") : print("半");
}
/** System.out.println()ではオペランドになれないので. */
private static Void print(String s) {
System.out.println(s);
return null;
}
}
条件演算子は使うとかっこよくなった気分にひたれるのだが、見慣れない記号なので、可読性が悪くなると言われている。概要のサンプルコードのような単純な例ではむしろ可読性が上がるのだが、特にオペランドの式が長くなったときや、条件演算子を入れ子にした場合には可読性の悪化が顕著に現れる。
条件分岐といえば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);
}
}
プログラミング言語に於いて、条件分岐を実現するには基本的にif文を用いる。しかし、C言語、Java、Python3等の幾つかのプログラミング言語では、条件演算子(三項演算子)を値を返すという性質を無視して if文を用いた手続きの分岐に使用できなくもない。
Javaの例は概要のサンプルコードを参照。良い子は真似をしてはいけない。ワンライナーとかを目指しているのでなければ条件分岐には素直にif文を使おう。
こういった可読性の問題を意識してか、同様のことを実現するのに演算子ではなく式(expression)という形を取る言語もある。たとえばPython3では「条件式 (Conditional Expressions)」と称する。
実際にPython3で記述したコードを次に示す。
print("1...Aレース / 2...Bレース")
n = int(input())
if n == 1:
print("Aレース選択")
else:
print("Bレース選択")
上記if文と等価なソースコードを、if文の部分を条件演算子に置き換えた形で次に示す。
print("1...Aレース / 2...Bレース")
n = int(input())
print("Aレース選択" if n == 1 else "Bレース選択")
この様に、たった1行で記述できる。
ソースコードの可読性の高さを売りにしているプログラミング言語の一つであるPythonでは、条件演算子の導入が長い間見送られ、バージョン2.5からようやく導入された。
ちなみに、ScalaやKotlinも条件演算子の機能はif式で実現している。
[返戻値] = [真偽値] ? [真の場合の式] : [偽の場合の式]
C言語、Java、Rubyで採用されている。
特に「三項演算子」といった場合にはこちらの書式を指す。
[返戻値] = [真の場合の式] if [真偽値] else [偽の場合の式]
Pythonで採用されている。Rubyの後置if文と外見上似ているが「文」ではなく「式」なので別物。
急上昇ワード改
最終更新:2025/12/12(金) 05:00
最終更新:2025/12/12(金) 05:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。