Оператор Conditional-Expression
C имеет один троичный оператор: оператор условного выражения (? :).
Синтаксис
условное-выражение:
логическое-выражение-ИЛИлогическое-выражение-ИЛИ**?** выражение : условное-выражение
логическое-выражение-ИЛИ должно принадлежать целочисленному типу, типу с плавающей запятой или типу указателя. Оно вычисляется с точки зрения эквивалентности значению 0. Точка последовательности следует за логическим-выражением-ИЛИ. Вычисление операндов продолжается следующим образом.
Если логическое-выражение-ИЛИ не равно 0, вычисляется выражение. Результат вычисления выражения предоставляется нетерминальным выражением. (Это означает, что выражение вычисляется, только если логическое-выражение-ИЛИ имеет значение true.)
Если логическое-выражение-ИЛИ равно 0, вычисляется условное-выражение. Результатом выражения является значение условного-выражения. (Это означает, что условное-выражение вычисляется, только если логическое-выражение-ИЛИ имеет значение false.)
Обратите внимание, что вычисляется только выражение или только условное-выражение, но не оба операнда.
Тип результата условной операции зависит от типа операнда выражение или условное-выражение, как показано ниже.
Если выражение или условное-выражение+ имеет целочисленный тип или тип с плавающей запятой (типы могут отличаться), оператор выполняет обычные арифметические преобразования. После преобразования тип результата совпадает с типом операндов.
Если выражение и условное-выражение имеют одинаковый тип структуры, объединения или указателя, результат будет принадлежать тому же типу структуры, объединения или указателя.
Если оба операнда имеют тип void, результат будет принадлежать типу void.
Если какой-либо из операндов является указателем на объект любого типа, а второй операнд является указателем на void, указатель на объект преобразуется в указатель на void, и результатом является указатель на void.
Если выражение или условное-выражение является указателем, а другой операнд — константным выражением со значением 0, результат будет иметь тип указателя.
В сравнении типа указателей любые квалификаторы типов (const или volatile) в типе, на который указывают указатели, не значимы, но тип результата наследует квалификаторы от обоих компонентов условного выражения.
Примеры
В следующих примерах показаны варианты использования условного оператора.
j = ( i < 0 ) ? ( -i ) : ( i );
В этом примере абсолютное значение i присваивается j. Если значение i меньше 0, значение -i присваивается j. Если значение i больше или равно 0, значение i присваивается j.
void f1( void );
void f2( void );
int x;
int y;
.
.
.
( x == y ) ? ( f1() ) : ( f2() );
В этом примере объявляется две функции f1 и f2 и две переменные x и y. Далее в программе, если две переменные имеют одинаковое значение, вызывается функция f1. В противном случае вызывается функция f2.