Elvis operator
In certain computer programming languages, the Elvis operator, often written ?:
, or
or ||
, is a binary operator that returns its first operand if that operand evaluates to a true value, and otherwise evaluates and returns its second operand. The Elvis operator is a variant of the ternary conditional operator, ? :
in the sense that the expression with the Elvis operator A ?: B
is approximately equivalent to the expression with the ternary operator A ? A : B
.
Some computer programming languages (e.g. C#) have different semantics for the ??
operator: instead of the first operand having to result in a boolean, it must result in an object reference.[1] If the resulting object reference is not null, it is returned. Otherwise the value of the second operand (which may also be null) is returned. This distinction is necessary because in C#, references are not implicitly convertible to a boolean.[2]
The name "Elvis operator" refers to the resemblance of one of its notations, ?:
, to an emoticon of Elvis Presley (?
representing his pompadour haircut).[3]
Example
Boolean variant
In a language that supports the Elvis operator, something like this:
x = f() ?: g()
will set x
equal to the result of f()
if that result is a true value, and to the result of g()
otherwise.
It is equivalent to this example, using the conditional ternary operator:
x = f() ? f() : g()
except that it does not evaluate the f()
twice if it is true.
Object reference variant
This code will result in a reference to an object that is guaranteed to not be null. Function f()
returns an object reference instead of a boolean, and may return null:
x = f() ?: "default value"
Languages supporting the Elvis operator
- In GNU C and C++ (that is: in C and C++ with GCC extensions), the second operand of the ternary operator is optional.[4] This has been the case since at least GCC 2.95.3[5] (March 2001).
- In Apache Groovy, the "Elvis operator"
?:
is documented as a distinct operator;[6] this feature was added in Groovy 1.5[7] (December 2007). Groovy, unlike GNU C and PHP, does not simply allow the second operand of ternary?:
to be omitted; rather, binary?:
must be written as a single operator, with no whitespace in between. - In PHP, it is possible to leave out the middle part of the ternary operator since PHP 5.3.[8] (June 2009).
- The Fantom programming language has the
?:
binary operator that compares its first operand withnull
. - In Kotlin, the Elvis operator returns its left-hand side if it is not null, and its right-hand side otherwise.[9] A common pattern is to use it with
return
, like this:val foo = bar() ?: return
- In Gosu, the
?:
operator returns the right operand if the left is null as well. - In C#, the null-conditional operator,
?.
is referred to as the "Elvis operator",[10] but it does not perform the same function. Instead, the null-coalescing operator??
does. - In ColdFusion and CFML, the Elvis operator was introduced using the
?:
syntax. - The Xtend programming language has an Elvis operator.[11]
- In Google's Closure Templates, the Elvis operator is a null coalescing operator, equivalent to
isNonnull($a) ? $a : $b
.[12] - Swift supports this concept with its Nil-coalescing operator
??
,[13] e.g.(a ?? b)
. - SQL supports this concept with its COALESCE function, e.g.
COALESCE(a, b)
. - In Ballerina, the Elvis operator
L ?: R
returns the value ofL
if it's not nil. Otherwise, return the value ofR
.[14] - Clojure supports this concept with the
or
[15] macro, e.g.(or a b)
. In the case of Clojure, it is var-arg, and not binary, e.g.(or a b c d e)
will return the first non false value.
Analogous use of the short-circuiting OR operator
In several languages, such as Common Lisp, Clojure, Lua, Perl, Python, Ruby, and JavaScript, the OR operator (typically ||
or or
) has the same behavior as the above: returning its first operand if it would evaluate to true in a boolean environment, and otherwise evaluating and returning its second operand. When the left hand side is true, the right hand side is not even evaluated; it is "short-circuited."
See also
?:
or conditional operator, when used as a ternary operator- Null coalescing operator,
??
or//
operator - Safe navigation operator, often
?.
- Spaceship operator
<=>
- Option type
References
- ^ "?? Operator". C# Reference. Microsoft. Retrieved 5 December 2018.
- ^ "The bool type". C# 6.0 draft specification. Microsoft. Retrieved 5 December 2018.
- ^ Joyce Farrell. Java Programming. p. 276. ISBN 978-1285081953.
The new operator is called Elvis operator because it uses a question mark and a colon together (?:); if you view it sideways, it reminds you of Elvis Presley.
- ^ "Using the GNU Compiler Collection (GCC): Conditionals". gcc.gnu.org.
- ^ "Using and Porting the GNU Compiler Collection (GCC): C Extensions". gcc.gnu.org.
- ^ "Elvis Operator (?: )".
- ^ "The Apache Groovy programming language - Groovy 1.5 release notes". groovy-lang.org.
- ^ "PHP: Comparison Operators - Manual". PHP website. Retrieved 2014-02-17.
- ^ "Null Safety - Kotlin Programming Language". Kotlin.
- ^ Albahari, Joseph; Albahari, Ben (2015). C# 6.0 in a Nutshell (6 ed.). O'Reilly Media. p. 59. ISBN 978-1491927069.
- ^ Efftinge, Sven. "Xtend - Expressions". eclipse.org.
- ^ "Closure Template Concepts - Closure Templates". Google Developers.
- ^ "The Swift Programming Language (Swift 4.1): Basic Operators". developer.apple.com.
- ^ "Elvis Operator - Ballerina Programming Language". Ballerina.
- ^ "clojure.core or macro API reference".