条件演算子

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

条件演算子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やJavaPerlなどでは、a ? b : c ? d : ea ? b : (c ? d : e) という意味だが、PHPの三項演算子[1]では (a ? b : c) ? d : e なので注意が必要である。

論理演算子[編集]

二項の論理演算子(Cの標準規格の用語では「論理AND演算子」「論理OR演算子」)も、条件演算子のような意味を持っており(短絡評価)、Javaでは条件AND演算子と条件OR演算子という名前である。

<条件式> && <真式>
<条件式> || <偽式>

1行目は、<条件式>が真の場合にのみ<真式>が評価される。偽の場合は条件式が評価されるのみである。式の値は、<条件式>が真の場合は<真式>、偽の場合は<条件式>がそのまま返される。

2行目の構文も、真偽が逆であることを除けば同様である。

なお、Javaの & などの演算子はオペランドの型がboolean型の場合、論理演算の意味だが、そちらは両方のオペランドを必ず評価し、このような条件的な意味はない。

Pascaland演算子と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]

脚注・参照[編集]

[ヘルプ]
  1. ^ (c and [x] or [y])[0] のようにする。中身が空でない配列は真であることを利用している。
  2. ^ PEP 308
  3. ^ Visual Basic 言語の新機能
  4. ^ If 演算子 (Visual Basic)