Оператор Conditional-Expression
C имеет один тернарный оператор: оператор условного выражения (? :
).
Синтаксис
conditional-expression
:
logical-OR-expression
logical-OR-expression
?
expression
:
conditional-expression
Должен logical-OR-expression
иметь целочисленный, плавающий или указательный тип. Он оценивается с точки зрения его эквивалентности 0. Следующая точка logical-OR-expression
последовательности. Вычисление операндов продолжается следующим образом.
Если
logical-OR-expression
значение равно 0,expression
вычисляется. Результат оценки выражения определяется нетерминальнымexpression
. (Это означаетexpression
, что вычисляется только в том случае, еслиlogical-OR-expression
значение true.)Если
logical-OR-expression
равно 0,conditional-expression
вычисляется. Результат выражения — значениеconditional-expression
. (Это означаетconditional-expression
, что вычисляется только в том случае, еслиlogical-OR-expression
имеет значение false.)
Эффект либо вычисляется, expression
conditional-expression
но не оба.
Тип результата условной операции зависит от типа expression
или conditional-expression
операнда, как показано ниже.
Если
expression
илиconditional-expression
имеет целочисленный или плавающий тип (их типы могут отличаться), оператор выполняет обычное арифметическое преобразование. После преобразования тип результата совпадает с типом операндов.Если оба
expression
типа иconditional-expression
имеют одну и ту же структуру, объединение или тип указателя, тип результата совпадает со структурой, объединением или типом указателя.Если оба операнда имеют тип
void
, результат будет принадлежать типуvoid
.Если какой-либо из операндов является указателем на объект любого типа, а второй операнд является указателем на
void
, указатель на объект преобразуется в указатель наvoid
, и результатом является указатель наvoid
.Если указатель
expression
conditional-expression
или является указателем, а другой операндом является константным выражением со значением 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
.