Введение

Условный оператор в компьютерном программировании

В компьютерном программировании, тернарный условный оператор – это оператор с тремя операндами, являющийся частью синтаксиса для базовых условных выражений во многих языках программирования. Его обычно называют условным оператором, тернарным if или встроенным if (сокращенно iif). Выражение вычисляется в, если значение истинно, и в противном случае – в. Можно прочитать как "если a, то b, иначе c". Форма является наиболее распространенной, но существуют альтернативные синтаксисы; например, Raku использует синтаксис, чтобы избежать путаницы с инфиксными операторами и , а в Visual Basic NET он принимает форму. Изначально он появился в CPL, где эквивалентный синтаксис для e1 ? e2 : e3 был e1 → e2, e3. Хотя возможно существование множества операторов с тремя операндами, условный оператор настолько распространен, а другие операторы с тремя операндами настолько редки, что условный оператор обычно называют просто тернарным оператором.

Вариации

Детальная семантика тернарного оператора, а также его синтаксис значительно отличаются от языка к языку. Основное различие между языками заключается в том, допускают ли выражения побочные эффекты (как в большинстве процедурных языков) и предоставляет ли язык семантику короткого замыкания, при которой вычисляется только выбранное выражение (большинство стандартных операторов в большинстве языков вычисляют все аргументы). Если язык поддерживает выражения с побочными эффектами, но не определяет семантику короткого замыкания, то возникает дополнительное различие в том, какое выражение вычисляется первым, – если язык гарантирует какой-либо конкретный порядок (следует помнить, что условное выражение также считается выражением). Кроме того, если порядок не гарантирован, важно, классифицируется ли результат как недетерминированный (значение, полученное в результате какого-либо порядка вычислений) или неопределённый (любое значение, зависящее от прихоти компилятора при наличии побочных эффектов, или даже приводящее к сбою). Если язык не допускает побочных эффектов в выражениях (что характерно для функциональных языков), то порядок вычислений не имеет семантического значения, хотя он может влиять на завершение бесконечной рекурсии или иметь другие последствия для производительности (в функциональном языке с сопоставлением с образцом короткое замыкание является неотъемлемой частью, и естественные случаи использования тернарного оператора возникают реже, поэтому этот аспект имеет ограниченное значение). По этим причинам в некоторых языках форма оператора может иметь несколько иную семантику, чем форма условного блока (в языке C – синтаксис приведённого примера – они фактически эквивалентны). Ассоциативность вложенных тернарных операторов также может различаться в разных языках. Почти во всех языках тернарный оператор правоассоциативен, поэтому вычисляется интуитивно как , однако PHP, в частности, печально известен своей левоассоциативностью и вычисляет выражение следующим образом: , что редко соответствует ожиданиям программиста. (В приведённых примерах предполагается, что тернарный оператор имеет низкий приоритет, что верно для всех языков семейства C и многих других.)

Эквивалентность карте

Троичный оператор также можно рассматривать как двоичную операцию отображения. В R и других языках с литеральными кортежами выражений можно имитировать троичный оператор выражением наподобие (этот идиом немного более естественен в языках с индексацией, начинающейся с 0). Вложенные троичные операторы можно моделировать как , где функция возвращает индекс первого истинного значения в векторе условий. Обратите внимание, что оба этих эквивалента отображения являются двоичными операторами, что показывает, что троичный оператор является троичным по синтаксису, а не по семантике. Эти конструкции можно рассматривать как слабую форму каррирования, основанную на конкатенации данных, а не на композиции функций. Если язык предоставляет механизм фьючерсов или промисов, то вычисление с коротким замыканием иногда также можно имитировать в контексте двоичной операции отображения.

Иди .

В Go отсутствует тернарный оператор if, поэтому всегда необходимо использовать полную конструкцию if.

Джулия

В Julia, "Обратите внимание, что пробелы вокруг `?` и `:` обязательны: выражение наподобие `a?b:c` не является допустимым тройным выражением (но новая строка допустима после `?` и `:`)."

Язык JavaScript

Условный оператор в JavaScript аналогичен оператору в C++ и Java, за исключением того, что среднее выражение не может быть выражением с запятой. Также, как и в C++, но в отличие от C или Perl, он не имеет более высокого приоритета, чем присваивание справа – то есть эквивалентно `var timeout = settings === null ? 1000 : settings.timeout;` вместо этого.

Как и в C# и Java, выражение будет вычисляться только в том случае, если оно соответствует данному условию; другое выражение вычислено не будет.