请输入您要查询的百科知识:

 

词条 Elvis operator
释义

  1. Example

     Boolean variant  Object reference variant 

  2. Languages supporting the Elvis operator

  3. Analogous use of the short-circuiting OR operator

  4. See also

  5. References

{{About|the use of the operator as a binary operator|use as a ternary 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 this 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.[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 with null.
  • 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 of L if it's not nil. Otherwise, return the value of R. [14]

Analogous use of the short-circuiting OR operator

In several languages, such as Common Lisp, 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

1. ^{{cite web |title=?? Operator |url=https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator |website=C# Reference |publisher=Microsoft |accessdate=5 December 2018}}
2. ^{{cite web |title=The bool type |url=https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/types#the-bool-type |website=C# 6.0 draft specification |publisher=Microsoft |accessdate=5 December 2018}}
3. ^{{cite book|title=Java Programming|author=Joyce Farrell|isbn=978-1285081953|page=276|quote=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.}}
4. ^{{cite web|url=https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals|title=Using the GNU Compiler Collection (GCC): Conditionals|website=gcc.gnu.org}}
5. ^{{cite web|url=https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC70|title=Using and Porting the GNU Compiler Collection (GCC): C Extensions|website=gcc.gnu.org}}
6. ^{{cite web|url=http://docs.groovy-lang.org/latest/html/documentation/index.html#_elvis_operator|title=Elvis Operator (?: )}}
7. ^{{cite web|url=http://groovy-lang.org/releasenotes/groovy-1.5.html|title=The Apache Groovy programming language - Groovy 1.5 release notes|website=groovy-lang.org}}
8. ^{{cite web |url=http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary |publisher=PHP website |title=PHP: Comparison Operators - Manual |accessdate=2014-02-17}}
9. ^{{cite web|url=https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator|title=Null Safety - Kotlin Programming Language|website=Kotlin}}
10. ^{{cite book |last1=Albahari |first1=Joseph |last2=Albahari |first2=Ben |date=2015 |title=C# 6.0 in a Nutshell |edition=6 |publisher=O'Reilly Media |isbn=978-1491927069 |page=59}}
11. ^{{cite web|url=https://eclipse.org/xtend/documentation/203_xtend_expressions.html#elvis-operator|title=Xtend - Expressions|first=Sven|last=Efftinge|website=eclipse.org}}
12. ^{{cite web|url=https://developers.google.com/closure/templates/docs/concepts#operators|title=Closure Template Concepts - Closure Templates|website=Google Developers}}
13. ^{{cite web|url=https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html|title=The Swift Programming Language (Swift 4.1): Basic Operators|website=developer.apple.com}}
14. ^{{cite web|url=https://ballerina.io/learn/by-example/elvis-operator.html|title=Elvis Operator - Ballerina Programming Language|website=Ballerina}}

4 : Operators (programming)|Binary operations|Conditional constructs|Articles with example code

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/11/10 12:58:39