エルビス演算子

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

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

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

[編集]

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

x = exprL ?: exprR

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

x = exprL ? exprL : exprR

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

x = exprL
x = x ? x : exprR

名称[編集]

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

サポートする言語[編集]

  • GNU C/C++ (GCCによる拡張) では、三項演算子の第二項を省略することができる[4]。GCC 2.95.3より使用可能[5] (March 2001)。
  • PHPでは PHP 5.3より ? : の第二項を省略可能[6] (June 2009)。
  • Apache Groovyではエルビス演算子?:は独立したオペレータとして文書化されている[7]。この機能はGroovy 1.5より追加された[8] (December 2007). GroovyはGNU GやPHPと異なり? :の第二項を省略することは許されておらず、?:の間にスペースを入れることはできない。
  • Fantomではエルビス演算子の第一項をnullと比較する。
  • Kotlinではエルビス演算子の第一項をnullと比較する。また、第二項に制御式を記述することもできる[9]。よくあるパターンとしてthrow式やreturn式を記述する(val foo = bar() ?: return)。
  • Gosuではエルビス演算子の第一項をnullと比較する。
  • C#ではnull合体演算子がエルビス演算子と同一視されることがあるが[10][11]、第一項をnullと比較するという点でエルビス演算子とは挙動が異なる。

OR演算子によるイディオム[編集]

PerlPythonJavaScriptなどではOR演算子 (||またはor) が同様の働きをする。すなわち第一項が真偽値としてtrueで評価される場合はその値を、そうでない場合は第二項を返す。

関連項目[編集]

参考[編集]

  1. ^ 言語によっては「非null」。
  2. ^ coding style - ?: operator”. Stack Overflow. 2014年2月17日閲覧。
  3. ^ Joyce Farrell. Java Programming. p. 276. ISBN 978-1285081953. "The new operator is called Elvis operator because it uses a question mark and a colo together (?:)" 
  4. ^ https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals
  5. ^ https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC70
  6. ^ PHP: Comparison Operators - Manual”. PHP website. 2014年2月17日閲覧。
  7. ^ Elvis Operator (?: )”. 2017年2月26日閲覧。
  8. ^ http://groovy-lang.org/releasenotes/groovy-1.5.html
  9. ^ https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator
  10. ^ http://stackoverflow.com/questions/27493541/null-conditional-operator-and-string-interpolation-in-c-sharp-6
  11. ^ https://www.linqpad.net/download.aspx