埃爾維斯運算符
外觀
編程語言中,埃爾維斯運算符是一種二元運算符,常寫為?:
、or
、||
,如果第一操作數求值為真則返回其值,否則返回第二操作數的值。類似於帶有「最後值」語義的短路求值。埃爾維斯運算符是受三元條件運算符 ? :
啟發而被提出的。因為埃爾維斯運算符表達式A ?: B
近似於三元條件運算符A ? A : B
。
埃爾維斯運算符得名於它的通常表示法?:
,相似於埃爾維斯·普雷斯利(即「貓王」)的顏文字側臉的額發,或者其他角度看相遇於他的得意的笑臉。[1]
有一個相似的運算符是空值結合運算符,把布爾真值檢查改為是否為空指針null。常寫為??
,如C#。[2]
編程語言支持
[編輯]- GNU C和C++的語言擴展,從2001年3月的GCC 2.95.3版本開始,三元運算符的第二操作數是可選的。[3]看起來這是最早的埃爾維斯運算符。[4]
- Apache Groovy的埃爾維斯運算符
?:
是個獨特的運算符。[5]起自2007年12月的Groovy 1.5[6]。不同於GNU C和PHP,Groovy不是簡單地允許三元運算符?:
第二操作數可忽略,而是?:
作為單獨的二元運算符其間不能有空格符。 - 從PHP 5.3開始,允許三元運算符的中間部分可留空。[7] (June 2009).
- Fantom語言的
?:
二元運算符,比較第一操作數是否為null
。 - Kotlin語言的埃爾維斯運算符的左操作數的值不為
null
則返回其值, 否則返回右操作數的值。[8] 常用於return
,如:val foo = bar() ?: return
- Gosu語言,
?:
運算符 - C#的安全導航運算符
?.
是一種埃爾維斯運算符,[9]。但C#的空值結合運算符??
才是相當於別的語言的?:
的埃爾維斯運算符。 - Adobe ColdFusion和CFML的埃爾維斯運算符是
?:
- Xtend有埃爾維斯運算符.[10]
- GoogleClosure Templates的埃爾維斯運算符是空值結合運算符,等效於
isNonnull($a) ? $a : $b
。[11] - Swift的Nil結合運算符
??
[12],例如(a ?? b)
. - SQL的COALESCE函數,例如
COALESCE(a, b)
。 - Ballerina的埃爾維斯運算符
L ?: R
[13] - Clojure支持
or
[14]宏,如(or a b)
。這是操作數個數可變的操作符而不是二元操作符,例如(or a b c d e)
將返回第一個非假的操作數的值。 - Dart語言提供了??運算符
- JavaScript的空值結合運算符
??
,例如(a ?? b)
[15] - TypeScript從版本3.7開始[16],如同JavaScript開始支持埃爾維斯運算符。
- Lua支持
or
[17]邏輯運算符,如(a or b)
.
類似的短路運算符OR
[編輯]在Common Lisp, Clojure, Lua, Object Pascal, Perl, Python, Ruby, JavaScript等編程語言中, OR運算符(典型為||
或or
)都是短路行為:如果左操作數的值為真,則表達式結果為真,不再對右操作數求值。這被稱作短路求值。
C/C++語言標準強制||
和&&
是短路求值運算符。
參見
[編輯]參考文獻
[編輯]- ^ Joyce Farrell. Java Programming. 7 February 2013: 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.
- ^ ?? Operator. C# Reference. Microsoft. [5 December 2018]. (原始內容存檔於2022-02-07).
- ^ Using the GNU Compiler Collection (GCC): Conditionals. gcc.gnu.org. [2022-03-05]. (原始內容存檔於2022-01-12).
- ^ Using and Porting the GNU Compiler Collection (GCC): C Extensions. gcc.gnu.org. [2022-03-05]. (原始內容存檔於2021-07-14).
- ^ Elvis Operator (?: ). [2022-03-05]. (原始內容存檔於2021-08-16).
- ^ The Apache Groovy programming language - Groovy 1.5 release notes. groovy-lang.org. [2022-03-05]. (原始內容存檔於2022-02-11).
- ^ PHP: Comparison Operators - Manual. PHP website. [2014-02-17]. (原始內容存檔於2022-02-28).
- ^ Null Safety - Kotlin Programming Language. Kotlin. [2022-03-05]. (原始內容存檔於2022-02-13).
- ^ Albahari, Joseph; Albahari, Ben. C# 6.0 in a Nutshell 6. O'Reilly Media. 2015: 59. ISBN 978-1491927069.
- ^ Efftinge, Sven. Xtend - Expressions. eclipse.org. [2022-03-05]. (原始內容存檔於2021-05-06).
- ^ Closure Templates - Expressions. GitHub. 29 October 2021 [2022-03-05]. (原始內容存檔於2022-03-05).
- ^ The Swift Programming Language (Swift 4.1): Basic Operators. developer.apple.com. [2022-03-05]. (原始內容存檔於2017-11-12).
- ^ Elvis Operator - Ballerina Programming Language. Ballerina. [2018-12-19]. (原始內容存檔於2018-12-20).
- ^ clojure.core or macro API reference. [2022-03-05]. (原始內容存檔於2022-02-25).
- ^ Nullish coalescing operator (??). mozilla. [2021-01-28]. (原始內容存檔於2022-02-28) (英語).
- ^ nullish coalescing commit by Kingwl · Pull Request #32883 · microsoft/TypeScript. GitHub. [2019-10-08]. (原始內容存檔於2020-11-12) (英語).
- ^ Lua or operator Reference. [2022-03-05]. (原始內容存檔於2022-01-30).