Тернарный оператор в программировании: краткая форма условного оператора if-else. Синтаксис, примеры использования в разных языках (C, Raku, Visual Basic).
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Условный оператор в компьютерном программировании
Conditional operator in computer programming
В компьютерном программировании, тернарный условный оператор – это оператор с тремя операндами, являющийся частью синтаксиса для базовых условных выражений во многих языках программирования. Его обычно называют условным оператором, тернарным if или встроенным if (сокращенно iif). Выражение вычисляется в, если значение истинно, и в противном случае – в. Можно прочитать как "если a, то b, иначе c". Форма является наиболее распространенной, но существуют альтернативные синтаксисы; например, Raku использует синтаксис, чтобы избежать путаницы с инфиксными операторами и , а в Visual Basic NET он принимает форму. Изначально он появился в CPL, где эквивалентный синтаксис для e1 ? e2 : e3 был e1 → e2, e3. Хотя возможно существование множества операторов с тремя операндами, условный оператор настолько распространен, а другие операторы с тремя операндами настолько редки, что условный оператор обычно называют просто тернарным оператором.
In computer programming, the ternary conditional operator is a ternary operator that is part of the syntax for basic conditional expressions in several programming languages. It is commonly referred to as the conditional operator, ternary if, or inline if (abbreviated iif). An expression evaluates to if the value of is true, and otherwise to One can read it aloud as "if a then b otherwise c". The form is by far and large the most common, but alternative syntaxes do exist; for example, Raku uses the syntax to avoid confusion with the infix operators and , whereas in Visual Basic NET, it instead takes the form
It originally comes from CPL, in which equivalent syntax for e1 ? e2 : e3 was e1 → e2, e3. Although many ternary operators are possible, the conditional operator is so common, and other ternary operators so rare, that the conditional operator is commonly referred to as the ternary operator.
Вариации
Детальная семантика тернарного оператора, а также его синтаксис значительно отличаются от языка к языку. Основное различие между языками заключается в том, допускают ли выражения побочные эффекты (как в большинстве процедурных языков) и предоставляет ли язык семантику короткого замыкания, при которой вычисляется только выбранное выражение (большинство стандартных операторов в большинстве языков вычисляют все аргументы). Если язык поддерживает выражения с побочными эффектами, но не определяет семантику короткого замыкания, то возникает дополнительное различие в том, какое выражение вычисляется первым, – если язык гарантирует какой-либо конкретный порядок (следует помнить, что условное выражение также считается выражением). Кроме того, если порядок не гарантирован, важно, классифицируется ли результат как недетерминированный (значение, полученное в результате какого-либо порядка вычислений) или неопределённый (любое значение, зависящее от прихоти компилятора при наличии побочных эффектов, или даже приводящее к сбою). Если язык не допускает побочных эффектов в выражениях (что характерно для функциональных языков), то порядок вычислений не имеет семантического значения, хотя он может влиять на завершение бесконечной рекурсии или иметь другие последствия для производительности (в функциональном языке с сопоставлением с образцом короткое замыкание является неотъемлемой частью, и естественные случаи использования тернарного оператора возникают реже, поэтому этот аспект имеет ограниченное значение). По этим причинам в некоторых языках форма оператора может иметь несколько иную семантику, чем форма условного блока (в языке C – синтаксис приведённого примера – они фактически эквивалентны). Ассоциативность вложенных тернарных операторов также может различаться в разных языках. Почти во всех языках тернарный оператор правоассоциативен, поэтому вычисляется интуитивно как , однако PHP, в частности, печально известен своей левоассоциативностью и вычисляет выражение следующим образом: , что редко соответствует ожиданиям программиста. (В приведённых примерах предполагается, что тернарный оператор имеет низкий приоритет, что верно для всех языков семейства C и многих других.)
The detailed semantics of "the" ternary operator as well as its syntax differs significantly from language to language. A top level distinction from one language to another is whether the expressions permit side effects (as in most procedural languages) and whether the language provides short circuit evaluation semantics, whereby only the selected expression is evaluated (most standard operators in most languages evaluate all arguments). If the language supports expressions with side effects but does not specify short circuit evaluation, then a further distinction exists about which expression evaluates first—if the language guarantees any specific order (bear in mind that the conditional also counts as an expression). Furthermore, if no order is guaranteed, a distinction exists about whether the result is then classified as indeterminate (the value obtained from some order) or undefined (any value at all at the whim of the compiler in the face of side effects, or even a crash). If the language does not permit side effects in expressions (common in functional languages), then the order of evaluation has no value semantics—though it may yet bear on whether an infinite recursion terminates, or have other performance implications (in a functional language with match expressions, short circuit evaluation is inherent, and natural uses for the ternary operator arise less often, so this point is of limited concern). For these reasons, in some languages the statement form can have subtly different semantics than the block conditional form } (in the C language—the syntax of the example given—these are in fact equivalent). The associativity of nested ternary operators can also differ from language to language. In almost all languages, the ternary operator is right associative so that evaluates intuitively as , but PHP in particular is notoriously left associative, and evaluates as follows: , which is rarely what any programmer expects. (The given examples assume that the ternary operator has low operator precedence, which is true in all C family languages, and many others.)
Эквивалентность карте
Троичный оператор также можно рассматривать как двоичную операцию отображения. В R и других языках с литеральными кортежами выражений можно имитировать троичный оператор выражением наподобие (этот идиом немного более естественен в языках с индексацией, начинающейся с 0). Вложенные троичные операторы можно моделировать как , где функция возвращает индекс первого истинного значения в векторе условий. Обратите внимание, что оба этих эквивалента отображения являются двоичными операторами, что показывает, что троичный оператор является троичным по синтаксису, а не по семантике. Эти конструкции можно рассматривать как слабую форму каррирования, основанную на конкатенации данных, а не на композиции функций. Если язык предоставляет механизм фьючерсов или промисов, то вычисление с коротким замыканием иногда также можно имитировать в контексте двоичной операции отображения.
The ternary operator can also be viewed as a binary map operation. In R—and other languages with literal expression tuples—one can simulate the ternary operator with something like the R expression (this idiom is slightly more natural in languages with 0 origin subscripts). Nested ternaries can be simulated as where the function returns the index of the first true value in the condition vector. Note that both of these map equivalents are binary operators, revealing that the ternary operator is ternary in syntax, rather than semantics. These constructions can be regarded as a weak form of currying based on data concatenation rather than function composition. If the language provides a mechanism of futures or promises, then short circuit evaluation can sometimes also be simulated in the context of a binary map operation.
Иди .
В Go отсутствует тернарный оператор if, поэтому всегда необходимо использовать полную конструкцию if.
There is no ternary if in Go, so use of the full if statement is always required.
Джулия
В Julia, "Обратите внимание, что пробелы вокруг `?` и `:` обязательны: выражение наподобие `a?b:c` не является допустимым тройным выражением (но новая строка допустима после `?` и `:`)."
In Julia, "Note that the spaces around and are mandatory: an expression like is not a valid ternary expression (but a newline is acceptable after both the and the )."
Язык JavaScript
Условный оператор в JavaScript аналогичен оператору в C++ и Java, за исключением того, что среднее выражение не может быть выражением с запятой. Также, как и в C++, но в отличие от C или Perl, он не имеет более высокого приоритета, чем присваивание справа – то есть эквивалентно `var timeout = settings === null ? 1000 : settings.timeout;` вместо этого.
The conditional operator in JavaScript is similar to that of C++ and Java, except for the fact the middle expression cannot be a comma expression. Also, as in C++, but unlike in C or Perl, it will not bind tighter than an assignment to its right— is equivalent to instead of
var timeout = settings === null ? 1000 : settings. timeout;
Как и в C# и Java, выражение будет вычисляться только в том случае, если оно соответствует данному условию; другое выражение вычислено не будет.
Just like C# and Java, the expression will only be evaluated if, and only if, the expression is the matching one for the condition given; the other expression will not be evaluated.