Поделиться через


Оператор 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.

См. также

Условный оператор: ? :