条件演算子
条件演算子(conditional operator)は、プログラミング言語の演算子で、条件文と同様な意味があるが、文ではなく値を持つ式になる。評価されると、条件式の値により異なる式が評価され、異なる値になる。
なお、CやC++など一部のプログラミング言語において、条件演算子とは後述する「? :」の演算子の名称である。
目次 |
概要 [編集]
「If ~ Then ~ Else ~」にあたる三項演算子があり、ほぼ唯一の、プログラミング言語において一般的な三項演算子である。また「If ~ Then ~」にあたる二項演算子もある。
三項演算子は、条件式、真式、偽式の3つのオペランドを結ぶ。二項演算子の場合は、条件式と、真式または偽式のいずれかの、2つのオペランドを結ぶ。
条件文との違いは、
- 真式・偽式は式(条件文における節のように文を置くことができない)
- 式であるため値を持つ
である。
種類 [編集]
三項演算子 [編集]
C言語などには、次の構文の三項の条件演算子がある。
<条件式> ? <真式> : <偽式>
3項を結ぶ必要上、「?」と「:」の2つの記号を使うが、演算子としては1つの演算子である。
<条件式>は真または偽の論理値を返す論理式である(あるいは論理値に暗黙に型変換可能な型を返す)。真式と偽式は同じ型の値を返さなければならない(暗黙に型変換可能なら許されることもある)。
この構文自身も式であるので値をもち、その値は上記<真式>または<偽式>の値のいずれかである。<条件式>が真の場合は<真式>、偽の場合は<偽式>の値となる。
例えば、次のように用いる(文字列型 String が利用可能とする)
String message = weight <= 100 ? "OK" : "積載量オーバー";
この場合、変数weightの値が100以下であれば変数messageに"OK"という文字列が代入され、それ以外であれば"積載量オーバー"という文字列が代入される。これは通常のif-else文を用いて書いた次の例と同じ意味であり、しばしば同じコンパイル結果となる。
String message; if (weight <= 100) { message = "OK"; } else { message = "積載量オーバー"; }
条件演算子はこの例のように、条件によって異なる値をある処理(上の例ではmessageへの代入)に適用する、という場合に記述を簡潔にすることができる。
さらにC++においては、if-else文 では必要な、message 宣言時のデフォルトコンストラクタが不要となる。
CやJavaやPerlなどでは、a ? b : c ? d : e は a ? b : (c ? d : e) という意味だが、PHPの三項演算子[1]では (a ? b : c) ? d : e なので注意が必要である。
論理演算子 [編集]
二項の論理演算子(Cの標準規格の用語では「論理AND演算子」「論理OR演算子」)も、条件演算子のような意味を持っており(短絡評価)、Javaでは条件AND演算子と条件OR演算子という名前である。
<条件式> && <真式> <条件式> || <偽式>
1行目は、<条件式>が真の場合にのみ<真式>が評価される。偽の場合は条件式が評価されるのみである。式の値は、<条件式>が真の場合は<真式>、偽の場合は<条件式>がそのまま返される。
2行目の構文も、真偽が逆であることを除けば同様である。
なお、Javaの & などの演算子はオペランドの型がboolean型の場合、論理演算の意味だが、そちらは両方のオペランドを必ず評価し、このような条件的な意味はない。
Pascalのand演算子とor演算子が短絡評価かどうかは処理系依存である。
Python [編集]
Pythonにおいては、Cの条件演算子と同じ機能は、構文に関する論争のため長い間実装されなかったが(論理演算子を使ったハックでなんとか似たことができる[1]というのもあった)、PEP 308として承認され、2006年9月の2.5 releaseに追加された[2]。
Python ではこの機能の式を条件式と呼び、構文は、C言語などとは順序が異なっている(新しい演算子ないしキーワードは導入されなかった)。Perlの後置if修飾子のような見た目になった。
<真の場合の値> if <条件式> else <偽の場合の値>
Visual Basic [編集]
Visual Basic(2008より前)、VBAには演算子はないが、同じように使える関数 Iif がある。
Iif(<条件式>, <真式>, <偽式>)
ただし条件演算子と違い、真式・偽式いずれも関数の引数なので、条件式の真偽にかかわらず双方とも評価される。条件に合わない側の値は捨てられるので値に影響はないが、真式・偽式に副作用がある(何か出力する、グローバル変数を書き換えるなど)場合は挙動が異なってくる。
Visual Basic 2008以降には[3]、条件演算子と同様の短絡評価をおこなうIf演算子がある。
If(<条件式>, <真式>, <偽式>) 'または If(<式1>, <式2>)
3引数の場合は、if-then-elseと同様の意味である。2引数の場合は、式1がNothingでない場合は式1の値を、式1がNothingの場合は式2の値を返す[4]。
脚注・参照 [編集]
- ^
(c and [x] or [y])[0]のようにする。中身が空でない配列は真であることを利用している。 - ^ PEP 308
- ^ Visual Basic 言語の新機能
- ^ If 演算子 (Visual Basic)