Тернарная условная операция


Терна́рная усло́вная опера́ция (от лат. ternarius — «тройной») — реализованная во многих языках программирования операция, возвращающая свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Аналогом тернарной условной операции в математической логике и булевой алгебре является условная дизъюнкция, которая записывается в виде и реализует алгоритм: «если , то , иначе ».

Обычно тернарная условная операция ассоциируется с операцией ?:, используемой в си-подобных языках программирования. На самом деле, подобные операции с другим синтаксисом имеются и во многих далёких по синтаксису от Си языках программирования. Среди популярных языков, в синтаксис которых встроена тернарная условная операция — Си, C++, JavaScript, Objective-C, C#, D, Java, ECMAScript, Perl, PHP, Python,Tcl, Ruby, Verilog, Turbo Basic. Своим появлением непосредственно в тернарной инфиксной форме эта операция обязана языку Алгол-60, в котором она имела синтаксис if o1 then o2 else o3 и затем языку BCPL (o1 -> o2, o3)[1] вместо привычного теперь o1 ? o2 : o3. Прототипом же этой операции, в свою очередь, является условная функция cond языка Лисп, записываемая по правилам Лиспа в префиксной форме и имеющая произвольное количество аргументов.

Обычно в реализацию операции закладывается вычисление условия и только одного из выражений, что обеспечивает в ряде случаев расширенные возможности, например, выражение x > 0 ? 0 : sqrt(x) считается корректным, несмотря на то, что из отрицательных чисел корень не берётся.

— в данном случае эквивалентная конструкция с использованием if-then-else потребовала бы записи вызова функции sprintf четыре раза.

В базовом Си нет логического типа данныхC99 появился логический тип _Bool), поэтому первый операнд должен быть числом (целым или вещественным) или указателем[2]; сначала вычисляется именно его значение и сравнивается с нулём, и, если оно не равно нулю, вычисляется и возвращается второй операнд, в случае равенства — третий. Второй и третий операнды могут быть различных типов (включая void).

В C++ тернарная условная операция имеет тот же синтаксис, что и в Си[3], однако за счёт наличия разницы между инициализацией и присваиванием, бывают ситуации, когда операцию ?: нельзя заменить конструкцией if-then-else, как, например, в следующем случае: