编程语言中,埃尔维斯运算符是一种二元运算符,常写为?:or||,如果第一操作数求值为真则返回其值,否则返回第二操作数的值。类似于带有“最后值”语义的短路求值。埃尔维斯运算符是受三元条件运算符 ? :启发而被提出的。因为埃尔维斯运算符表达式A ?: B近似于三元条件运算符A ? A : B

埃尔维斯运算符得名于它的通常表示法?:,相似于埃尔维斯·普雷斯利(即“猫王”)的颜文字侧脸的额发英语quiff,或者其他角度看相遇于他的得意的笑脸。[1]

有一个相似的运算符是空值结合运算符,把布尔真值检查改为是否为空指针null。常写为??,如C#[2]

faviconfavicon
2 sources

编程语言支持

  • GNU CC++的语言扩展,从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语言英语Fantom (programming language)?:二元运算符,比较第一操作数是否为null
  • Kotlin语言的埃尔维斯运算符的左操作数的值不为null则返回其值, 否则返回右操作数的值。[8] 常用于return,如:val foo = bar() ?: return
  • Gosu语言英语Gosu (programming language)?:运算符
  • C#安全导航运算符?.是一种埃尔维斯运算符,[9]。但C#的空值结合运算符??才是相当于别的语言的?:的埃尔维斯运算符。
  • Adobe ColdFusionCFML英语CFML的埃尔维斯运算符是?:
  • Xtend英语Xtend有埃尔维斯运算符.[10]
  • GoogleClosure Templates英语Google Closure Tools#Closure Templates的埃尔维斯运算符是空值结合运算符,等效于isNonnull($a) ? $a : $b[11]
  • Swift的Nil结合运算符??[12],例如(a ?? b).
  • SQL的COALESCE函数,例如COALESCE(a, b)
  • Ballerina英语Ballerina (programming language)的埃尔维斯运算符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).
faviconfaviconfaviconfaviconfavicon
15 sources

类似的短路运算符OR

Common Lisp, Clojure, Lua, Object Pascal, Perl, Python, Ruby, JavaScript等编程语言中, OR运算符(典型为||or)都是短路行为:如果左操作数的值为真,则表达式结果为真,不再对右操作数求值。这被称作短路求值

C/C++语言标准强制||&&短路求值运算符。

参见

参考文献

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.