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

Эффект либо вычисляется, expressionconditional-expression но не оба.

Тип результата условной операции зависит от типа expression или conditional-expression операнда, как показано ниже.

  • Если expression или conditional-expression имеет целочисленный или плавающий тип (их типы могут отличаться), оператор выполняет обычное арифметическое преобразование. Тип результата — это тип операндов после преобразования.

  • Если оба expression типа и conditional-expression имеют одну и ту же структуру, объединение или тип указателя, тип результата совпадает со структурой, объединением или типом указателя.

  • Если оба операнда имеют тип void, результат имеет тип void.

  • Если любой операнд является указателем на объект любого типа, а другой операнда — voidуказатель на, указатель на объект преобразуется в указатель void , а результат — указатель voidна .

  • Если указатель expressionconditional-expression или является указателем, а другой операндом является константным выражением со значением 0, тип результата является типом указателя.

В сравнении типов для указателей все квалификаторы типов (const или volatile) в типе, к которому точки указателя являются незначительными, но тип результата наследует квалификаторы от обоих компонентов условного.

Примеры

В следующих примерах показано использование условного оператора:

j = ( i < 0 ) ? ( -i ) : ( i );

В этом примере присваивается абсолютное значение ij. Если i значение меньше 0, -i назначается j. Если i значение больше или равно 0, i назначается j.

void f1( void );
void f2( void );
int x;
int y;
    .
    .
    .
( x == y ) ? ( f1() ) : ( f2() );

В этом примере объявляются две функции и f2f1 две переменные, x а также yдве переменные. Далее в программе, если две переменные имеют одно и то же значение, вызывается функция f1 . f2 В противном случае вызывается.

См. также

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