В некоторых языках компьютерного программирования оператор Элвиса часто пишется ?:, - это двоичный оператор, который возвращает вычисленный первый операнд, если этот операнд возвращает истину (в соответствии с соглашением, зависящим от языка, оно же. истинное значение), а в противном случае возвращает вычисленный второй операнд (в этом случае первый операнд считается аналогичным логически ложному) . Элвис оператор идентичен короткому замыканию с семантикой "последнего значения" и похож на тернарный оператор, ? :, поскольку выражение оператора Элвиса A ?: B приблизительно равно троичному условному выражению A ? A: B.

Название «оператор Элвиса» назван так, потому что в его обычном обозначении ? :, если смотреть сбоку, напоминает смайлик Элвиса Пресли с его фирменной прической . [1]

Аналогичным оператором является оператор объединения значений NULL, в котором логическая проверка истинности (истинности) заменяется проверкой на ненулевое значение. Обычно так пишут ?? и его можно увидеть в таких языках, как C# [2] или Dart [3]

Альтернативы править

В нескольких языках, таких как Common Lisp, Clojure, Lua, Object Pascal, Perl, Python, Ruby и JavaScript, оператор OR (обычно || или или) ведет себя так же, как описано выше: возвращает свой первый операнд, если он будет вычислять истинное значение, и в противном случае вычисляет и возвращает свой второй операнд, который может быть истинным или ложным значением. Когда левая часть верна, правая часть даже не оценивается; она "закорочена". Это отличается от поведения в других языках, таких как C/C++, где результатом || всегда будет (правильное) логическое значение.

Примеры править

Логический вариант править

На языке, поддерживающем оператор Элвиса, это:

x = f() ? : g()

установит x равным результату f() если этот результат истинен, и результату g() в противном случае.

Это эквивалентно примеру ниже, использующему условный тернарный оператор :

x = f() ? f() : g()

за исключением того, что он не оценивает f() дважды, если он дает истинный результат.

Вариант ссылки на объект править

Результатом этого кода будет ссылка на объект, который гарантированно не будет нулевым. Функция f() возвращает ссылку на объект вместо логического значения и может возвращать значение null, которое повсеместно считается ложным:

x = f() ? : "default value"

Языки, поддерживающие оператор Элвиса править

  • Perl, начиная с версии 5.10, предоставляет логический оператор ИЛИ: //, эквивалентный defined $a ? $a : $b [4]
  • В GNU C и C++ (то есть в C и C++ с расширениями GCC ) второй операнд тернарного оператора является необязательным. [5] Это имело место начиная с GCC 2.95.3 (март 2001 г.), и, похоже, это оригинальный оператор Элвиса. [6]
  • В Apache Groovy «оператор Элвиса» ? : задокументирован как отдельный оператор; [7] эта функция была добавлена в Groovy 1.5 [8] (декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, не позволяет просто использовать второй операнд ? : опустить; скорее, двоичный ? : должен быть записан как один оператор, без пробелов между ними.
  • В PHP можно исключить среднюю часть тернарного оператора, начиная с PHP 5.3. [9] (июнь 2009 г.).
  • Язык программирования Fantom имеет расширение ? : бинарный оператор, который сравнивает свой первый операнд с null .
  • В Kotlin оператор Элвиса возвращает свою левую часть, если она не равна нулю, и правую часть в противном случае. [10] Распространенным шаблоном является использование его с return, например: val foo = bar() ?: return
  • В Госу ? Оператор : возвращает правый операнд, если левый также равен нулю.
  • В C# — условный оператор с нулевым значением ?. называется «оператором Элвиса» [11], но он не выполняет ту же функцию. Вместо него это делает оператор объединения нулей.
  • В ColdFusion и CFML оператор Элвиса был введен с использованием ? : синтаксис.
  • Поддерживается языком Xtend. [12]
  • В шаблонах закрытия Google оператор Элвиса является оператором объединения значений NULL, эквивалентным isNonnull($a) ? $a : $b . [13]
  • В Ballerina оператор Элвиса L ? : R возвращает значение L, если оно не равно нулю. В противном случае верните значение R . [14]
  • В JavaScript нулевой оператор объединения ( ?? ) — это логический оператор, который возвращает свой правый операнд, когда его левый операнд имеет значение null или undefined, и в противном случае возвращает свой левый операнд. [15]

Смотрите также править

  • ? : или условный оператор, если он используется как тернарный оператор
  • Безопасный оператор навигации, часто ?.
  • Оператор космического корабля < = >
  • Тип опции

Ссылки править

Примечания править

  1. Joyce Farrell. Java Programming. — 7 February 2013. — P. 276. — «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.». — ISBN 978-1285081953.
  2. ?? Operator. C# Reference. Microsoft. Дата обращения: 5 декабря 2018.
  3. Conditional expressions. Dart Language. Google.
  4. perlop - Perl operators and precedence -Perldoc Browser. Perl.org. Дата обращения: 19 января 2023.
  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. Дата обращения: 17 февраля 2014.
  10. Null Safety - Kotlin Programming Language. Kotlin.
  11. Albahari, Joseph. C# 6.0 in a Nutshell / Joseph Albahari, Ben Albahari. — 6. — O'Reilly Media, 2015. — P. 59. — ISBN 978-1491927069.
  12. Efftinge. Xtend - Expressions. eclipse.org.
  13. Closure Templates - Expressions. GitHub (29 октября 2021).
  14. Elvis Operator - Ballerina Programming Language. Ballerina. Дата обращения: 19 декабря 2018. Архивировано из оригинала 20 декабря 2018 года.
  15. Nullish coalescing operator (??) - JavaScript | MDN (амер. англ.). developer.mozilla.org. Дата обращения: 5 января 2023.