特定のコンピュータ プログラミング言語では、エルビス演算子( と表記されることが多い?:) は、評価された最初のオペランドが論理的に true に似た値 (言語依存の規則に従って、つまり、真の値) に評価された場合は評価された最初のオペランドを返し、そうでない場合は評価された2番目のオペランド (この場合、最初のオペランドは論理的に falseに似た値、つまり、偽の値に評価されます) を返すバイナリ演算子です。これは、「最後の値」セマンティクスを持つ短絡またはと同じです。エルビス演算子の表記は、三項条件演算子、にヒントを得たものです。? :エルビス演算子式は、A ?: B三項条件式 とほぼ同等であるためですA ? A : B。
「エルヴィス演算子」という名前は、その一般的な表記法である を?:横から見ると、特徴的な髪型のエルヴィス・プレスリーの顔文字に似ていることに由来しています。[1]
同様の演算子として、 null合体演算子があります。これは、ブール値の真偽チェックが非nullチェックに置き換えられています。これは通常 と記述され、 C# [2]やDart??などの言語で見られます。[3]
代替構文
Common Lisp、Clojure、Lua、Object Pascal、Perl、Python、Ruby、JavaScriptなどのいくつかの言語では、論理和演算子 (通常は||またはor) は上記と同じ動作をします。つまり、最初のオペランドが真の値に評価される場合はそれを返し、そうでない場合は 2 番目のオペランドを評価して返します。2 番目のオペランドは、真値または偽値の場合があります。左側が真の場合は、右側は評価されません。つまり、「短絡」されます。これは、 の結果が常に (適切な) ブール値になる C/C++ などの他の言語の動作とは異なります||。
例
ブール変数
Elvis 演算子をサポートする言語では、次のようになります。
x = f() ?: g()
x結果が真である場合はの結果に等しく設定されf()、そうでない場合は の結果に等しく設定されますg()。
これは、条件付き三項演算子を使用した次の例と同等です。
x = f() ? f() : g()
ただし、結果が真である場合は 2 回評価されません。常に同じ結果を返す状態に依存しない関数でない
f()場合は、任意の動作が発生する可能性があることに注意してください。f()
オブジェクト参照バリアント
このコードは、null ではないことが保証されたオブジェクトへの参照を生成します。関数はf()ブール値ではなくオブジェクト参照を返し、普遍的に偽とみなされる null を返す場合があります。
x = f() ?: "default value"
Elvis演算子をサポートする言語
- GNU CとC++(つまり、GCC拡張付きのCとC++)では、三項演算子の2番目のオペランドはオプションです。[4]これは少なくともGCC 2.95.3(2001年3月)以降で当てはまっており、元のエルビス演算子のようです。 [ 5]
- Apache Groovyでは、「エルビス演算子」は
?:別個の演算子として文書化されています。[6]この機能はGroovy 1.5 [7] (2007年12月) で追加されました。Groovyは、GNU CやPHPとは異なり、三項演算子の2番目のオペランドを省略することは許可されていません?:。むしろ、二項演算子は?:間に空白を入れずに単一の演算子として記述する必要があります。 - PHPでは、PHP 5.3以降では三項演算子の中間部分を省略することが可能です。[8](2009年6月)。
- Fantomプログラミング言語には、最初
?:のオペランドをと比較する二項演算子がありますnull。 - Kotlinでは、エルビス演算子は、nullでない場合は左側を返し、そうでない場合は右側を返します。[9]一般的なパターンは
return、次のように と一緒に使用することです。val foo = bar() ?: return - Gosuでは、
?:左のオペランドも null の場合、演算子は右のオペランドを返します。 - C#では、ヌル条件演算子は
?.「エルビス演算子」[10]と呼ばれますが、同じ機能を実行するわけではありません。代わりに、ヌル結合演算子が??同じ機能を実行します。 - ColdFusionおよびCFMLでは、構文を使用して Elvis 演算子が導入されました
?:。 - Xtendプログラミング言語にはエルビス演算子がある。[11 ]
- Googleのクロージャテンプレートでは、エルビス演算子はヌル合体演算子であり、 と同等である
isNonnull($a) ? $a : $b。[12] - Ballerinaでは、エルビス演算子はnilでない場合は
L ?: Rの値を返します。そうでない場合は の値を返します。[13]LR - JavaScriptでは、null合体(
??)演算子は、左側のオペランドがnullまたはの場合は右側のオペランドを返しundefined、それ以外の場合は左側のオペランドを返す論理演算子です。[14]
参照
?:または条件演算子、三項演算子として使用される場合- 安全航行オペレーターは、多くの場合
?. - 宇宙船オペレーター
<=> - オプションタイプ
参考文献
- ^ Joyce Farrell (2013年2月7日). Javaプログラミング. Cengage Learning. p. 276. ISBN 978-1285081953
新しい演算子は疑問符とコロン (?:) を一緒に使用するため、エルビス演算子と呼ばれます。横から見ると、エルビス プレスリーを連想させます
。 - ^ 「?? 演算子」。C# リファレンス。Microsoft。2018年12 月 5 日閲覧。
- ^ 「条件式」。Dart言語。Google。
- ^ 「GNU コンパイラ コレクション (GCC) の使用: オペランドを省略した条件文」gcc.gnu.org。
- ^ 「GNU コンパイラ コレクション (GCC) の使用と移植: C 拡張機能」gcc.gnu.org。
- ^ 「エルヴィス演算子 (?: )」。
- ^ 「Apache Groovy プログラミング言語 - Groovy 1.5 リリース ノート」。groovy-lang.org。
- ^ 「PHP: 比較演算子 - マニュアル」。PHP ウェブサイト。2014年 2 月 17 日閲覧。
- ^ 「Null 安全性 - Kotlinプログラミング言語」。Kotlin 。
- ^ アルバハリ、ジョセフ;アルバハリ、ベン (2015)。C# 6.0 の概要(第 6 版)。オライリーメディア。 p. 59.ISBN 978-1491927069。
- ^ Efftinge, Sven. 「Xtend - Expressions」. eclipse.org .
- ^ 「クロージャ テンプレート - 式」。GitHub。2021年10月 29 日。
- ^ 「Elvis Operator - Ballerinaプログラミング言語」。Ballerina 。 2018年12月20日時点のオリジナルよりアーカイブ。2018年12月19日閲覧。
- ^ 「Nullish coalescing operator (??) - JavaScript | MDN」。developer.mozilla.org 。 2023年1月5日閲覧。
