In certain computer programming languages, the Elvis operator, often written ?:, is a binary operator that returns the evaluated first operand if that operand evaluates to a value likened to logically true (according to a language-dependent convention, in other words, a truthy value), and otherwise returns the evaluated second operand (in which case the first operand evaluated to a value likened to logically false, in other words, a falsy value). This is identical to a short-circuit or with "last value" semantics. The notation of the Elvis operator was inspired by the ternary conditional operator, ? :, since the Elvis operator expression A ?: B is approximately equivalent to the ternary conditional expression A ? A : B.

The name "Elvis operator" refers to the fact that when its common notation, ?:, is viewed sideways, it resembles an emoticon of Elvis Presley with his signature hairstyle.[1]

A similar operator is the null coalescing operator, where the boolean truth(iness) check is replaced with a check for non-null instead. This is usually written ??, and can be seen in languages like C#[2] or Dart.[3]

Alternative syntaxes

In several languages, such as Common Lisp, Clojure, Lua, Object Pascal, 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 a truthy value, and otherwise evaluating and returning its second operand, which may be a truthy or falsy value. When the left-hand side is truthy, the right-hand side is not even evaluated; it is "short-circuited". This is different than the behavior in other languages such as C/C++, where the result of || will always be a (proper) boolean.

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 truthy, 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 f() twice if it yields truthy. Note the possibility of arbitrary behaviour if f() is not a state-independent function that always returns the same result.

Object reference variant

Main article: null coalescing operator

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, which is universally regarded as falsy:

x = f() ?: "default value"

Languages supporting the Elvis operator

See also

References

  1. ^ Joyce Farrell (7 February 2013). 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.
  2. ^ "?? Operator". C# Reference. Microsoft. Retrieved 5 December 2018.
  3. ^ "Conditional expressions". Dart Language. Google.
  4. ^ "perlop - Perl operators and precedence -Perldoc Browser". Perl.org. Retrieved 2023-01-19.
  5. ^ "Using the GNU Compiler Collection (GCC): Conditionals with omitted operands". gcc.gnu.org.
  6. ^ "Using and Porting the GNU Compiler Collection (GCC): C Extensions". gcc.gnu.org.
  7. ^ "Elvis Operator (?: )".
  8. ^ "The Apache Groovy programming language - Groovy 1.5 release notes". groovy-lang.org.
  9. ^ "PHP: Comparison Operators - Manual". PHP website. Retrieved 2014-02-17.
  10. ^ "Null Safety - Kotlin Programming Language". Kotlin.
  11. ^ Albahari, Joseph; Albahari, Ben (2015). C# 6.0 in a Nutshell (6 ed.). O'Reilly Media. p. 59. ISBN 978-1491927069.
  12. ^ Efftinge, Sven. "Xtend - Expressions". eclipse.org.
  13. ^ "Closure Templates - Expressions". GitHub. 29 October 2021.
  14. ^ "Elvis Operator - Ballerina Programming Language". Ballerina. Archived from the original on 2018-12-20. Retrieved 2018-12-19.
  15. ^ "Nullish coalescing operator (??) - JavaScript | MDN". developer.mozilla.org. Retrieved 2023-01-05.