エルビス演算子

エルビス演算子（エルビスえんざんし、）は、いくつかのプログラミング言語にある演算子で、字句構文は ?: である。三項条件演算子 (? :) と違い、この連続する2文字で1つの演算子であり、意味的には三項演算子の第二項 (A ? B : CのB) が無いもの、というような機能を持っている。

Null合体演算子に似た制御機能を持つが、第一項の扱いが異なる。ただし、エルビス演算子にNull合体演算子の意味と役割を持たせている言語もある。

例

エルビス演算子を用いて以下のように記述すると、xには左式exprLの評価結果が真言語によっては「非null」。と判定される場合にはその結果が、それ以外の場合には右式exprRの評価結果がセットされる。

 x = exprL ?: exprR

これは三項演算子を使って以下のように書くこともできる。

 x = exprL ? exprL : exprR

ただし、エルビス演算子ではexprLが真の場合でも、式が二度評価されることはない。すなわち、以下と同値である。

 x = exprL
 x = x ? x : exprR

名称

エルビス演算子はエルビス・プレスリーの顔文字 (emoticon) に形が似ていることからこう呼ばれる。

 サポートする言語 

 GNU C/C++ (GCCによる拡張) では、三項演算子の第二項を省略することができるhttps://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals。GCC 2.95.3より使用可能https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC70 (March 2001)。
 PHPでは PHP 5.3より ? : の第二項を省略可能 (June 2009)。
 Apache Groovyではエルビス演算子?:は独立したオペレータとして文書化されている。この機能はGroovy 1.5より追加されたhttp://groovy-lang.org/releasenotes/groovy-1.5.html (December 2007). GroovyはGNU GやPHPと異なり? :の第二項を省略することは許されておらず、?:の間にスペースを入れることはできない。
 Fantomではエルビス演算子の第一項をnullと比較する。
 Kotlinではエルビス演算子の第一項をnullと比較する。また、第二項に制御式を記述することもできるhttps://kotlinlang.org/docs/reference/null-safety.html#elvis-operator。よくあるパターンとしてthrow式やreturn式を記述する（val foo = bar() ?: return）。
 Gosuではエルビス演算子の第一項をnullと比較する。
 C#ではnull合体演算子がエルビス演算子と同一視されることがあるがhttp://stackoverflow.com/questions/27493541/null-conditional-operator-and-string-interpolation-in-c-sharp-6https://www.linqpad.net/download.aspx、第一項をnullと比較するという点でエルビス演算子とは挙動が異なる。

 短絡評価の論理和演算 

Perl、Python、JavaScriptなどでは論理和演算 (||またはor) が同様の働きをする。すなわち第1項が真値あるいは真値とみなされる値である場合は第2項を評価せずに第1項が論理和式の評価値となり（短絡評価）、第1項が偽値あるいは偽値とみなされる値である場合は第2項が論理和式の評価値となる。

Common Lisp、Scheme では、or特殊フォームがエルビス演算子に対応するが、エルビス演算子よりも汎用的であり、or特殊フォームは任意個数の項を受け入れる。第1項から順に真値が見つかるまで項を評価してゆき、真値が見つかったらそれ以降の項の評価せずに、見つかった真値をor特殊フォームの評価値として評価を終える。

関連項目
条件演算子: ? :
Null合体演算子: ?? or // operator
Null条件演算子: ?.など
宇宙船演算子: <=>

脚注

 注釈 

 出典 

Category:制御構造
Category:二項演算
Category:プログラミング言語の演算子