Оператор Элвиса - Википедия - Elvis operator
Было высказано предположение, что Нулевой оператор объединения быть слился в эту статью. (Обсуждать) Предлагается с августа 2020 года. |
Было предложено, чтобы эта статья была слился в Оценка короткого замыкания. (Обсуждать) Предлагается с ноября 2020 года. |
В определенных компьютерное программирование языки, Оператор Элвиса, часто пишется ?:
, или же
или же ||
, это бинарный оператор который возвращает свой первый операнд, если этот операнд оценивается как истинное значение, а в противном случае оценивает и возвращает свой второй операнд. Это идентично короткое замыкание или же с семантикой "последнее значение". Обозначение оператора Элвиса было вдохновлено троичными условный оператор, ? :
поскольку выражение оператора Элвиса А?: B
примерно эквивалентно тернарному условному А? А: Б
.
Название «Оператор Элвиса» относится к тому факту, что при его общепринятом обозначении ?:
, при взгляде сбоку, напоминает смайлик из Элвис Пресли с его причёска.[1]
Аналогичным оператором является нулевой оператор объединения, где проверка на логическую истинность заменена проверкой на отсутствиеноль вместо. Обычно это пишется ??
, и его можно увидеть на таких языках, как C #.[2]
Пример
Логический вариант
На языке, поддерживающем оператор Элвиса, примерно так:
х = f ()?: g ()
установит Икс
равен результату f ()
если этот результат является истинным значением, и к результату грамм()
иначе.
Это эквивалентно этому примеру с использованием условный тернарный оператор:
х = е ()? f (): g ()
за исключением того, что он не оценивает f ()
дважды, если это правда.
Вариант ссылки на объект
Этот код приведет к ссылке на объект, который гарантированно не будет нулевым. Функция f ()
возвращает ссылку на объект вместо логического и может возвращать значение null:
x = f ()?: "значение по умолчанию"
Языки, поддерживающие оператора Элвиса
- В GNU C и C ++ (то есть: в C и C ++ с GCC extension), второй операнд тернарного оператора является необязательным.[3] Так было, по крайней мере, с GCC 2.95.3 (март 2001 г.), и, похоже, то оригинальный оператор Элвиса.[4]
- В Apache Groovy, "Оператор Элвиса"
?:
задокументирован как отдельный оператор;[5] эта функция была добавлена в Groovy 1.5[6] (Декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, нет просто разрешите второй операнд тернарного?:
быть опущенным; скорее двоичный?:
должен быть записан как один оператор без пробелов между ними. - В PHP, можно опустить среднюю часть тернарного оператора, начиная с PHP 5.3.[7] (Июнь 2009 г.).
- В Фантом язык программирования имеет
?:
бинарный оператор, который сравнивает свой первый операнд сноль
. - В Котлин, оператор Элвиса возвращает его левую часть, если она не равна нулю, и ее правую часть в противном случае.[8] Распространенный шаблон - использовать его с
возвращаться
, так:val foo = bar ()?: возврат
- В Госу, то
?:
оператор возвращает правый операнд, если левый также равен нулю. - В C #, то null-условный оператор
?.
называется «оператор Элвиса»,[9] но он не выполняет ту же функцию. Вместо этого оператор объединения с нулем??
делает. - В Холодный синтез и CFML, оператор Элвиса был введен с использованием
?:
синтаксис. - В Xtend В языке программирования есть оператор Элвиса.[10]
- В Google Шаблоны закрытия, оператор Элвиса является нулевой оператор объединения, что эквивалентно
isNonnull ($ a)? $ a: $ b
.[11] - Быстрый поддерживает эту концепцию с помощью оператора Nil-coalescing
??
,[12] например(а ?? б)
. - SQL поддерживает эту концепцию с помощью функции COALESCE, например
КОАЛЕС (а, б)
. - В Балерина, оператор Элвиса
L?: R
возвращает значениеL
если это не ноль. В противном случае верните значениер
.[13] - Clojure поддерживает эту концепцию
или же
[14] макрос, например(или а б)
. В случае Clojure это var-arg, а не двоичный, например(или a b c d e)
вернет первое не ложное значение. - Дротик язык обеспечивает ?? оператор, который возвращает значение правой стороны, если значение левой стороны равно нулю
- Машинопись поддерживает эту концепцию с помощью оператора объединения с нулевым значением
??
, например(а ?? б)
, начиная с v3.7.[15] - Lua поддерживает эту концепцию
или же
[16] логический оператор, например(а или б)
.
Аналогичное использование короткозамкнутого оператора ИЛИ
На нескольких языках, например Common Lisp, Clojure, Lua, Perl, Python, Рубин, и JavaScript, оператор ИЛИ (обычно ||
или же или же
) имеет то же поведение, что и выше: возвращает свой первый операнд, если он будет оцениваться как true в логической среде, и в противном случае оценивает и возвращает свой второй операнд. Когда левая часть истинна, правая часть даже не оценивается; это "закороченный. "Это отличается от поведения на других языках, таких как C / C ++, где результат ||
всегда будет логическим.
Смотрите также
?:
или же условный оператор, при использовании в качестве тернарный оператор- Оператор безопасной навигации, довольно часто
?.
- Оператор космического корабля
<=>
- Тип варианта
Рекомендации
- ^ Джойс Фаррелл. Программирование на Java. п. 276. ISBN 978-1285081953.
Новый оператор называется оператором Элвиса, потому что он использует вместе вопросительный знак и двоеточие (? :); если смотреть сбоку, он напоминает вам Элвиса Пресли.
- ^ «?? Оператор». Справочник по C #. Microsoft. Получено 5 декабря 2018.
- ^ «Использование коллекции компиляторов GNU (GCC): условные обозначения». gcc.gnu.org.
- ^ «Использование и перенос коллекции компиляторов GNU (GCC): расширения C». gcc.gnu.org.
- ^ "Оператор Элвиса (?:)".
- ^ «Язык программирования Apache Groovy - примечания к выпуску Groovy 1.5». groovy-lang.org.
- ^ «PHP: операторы сравнения - Руководство». Сайт PHP. Получено 2014-02-17.
- ^ "Null Safety - язык программирования Kotlin". Котлин.
- ^ Альбахари, Джозеф; Альбахари, Бен (2015). C # 6.0 в двух словах (6 изд.). O'Reilly Media. п. 59. ISBN 978-1491927069.
- ^ Efftinge, Sven. «Xtend - Выражения». eclipse.org.
- ^ «Шаблоны закрытия - Выражения». GitHub.
- ^ «Язык программирования Swift (Swift 4.1): основные операторы». developer.apple.com.
- ^ "Оператор Элвис - язык программирования балерин". Балерина.
- ^ "clojure.core или справочник по API макросов".
- ^ "nullish coalescing commit by Kingwl · Pull Request # 32883 · microsoft / TypeScript". GitHub. Получено 2019-10-08.
- ^ "Ссылка на Lua или оператор".