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

Синтаксис

expression ? expression : expression

Замечания

Условный оператор (? :) является тернарным оператором (он принимает три операнда). Условный оператор работает следующим образом.

  • Первый операнд неявно преобразуется в bool. Он вычисляется, и все побочные эффекты завершаются перед продолжением.

  • Если первый операнд оценивается true (1), то вычисляется второй операнд.

  • Если первый операнд оценивается false (0), то оценивается третий операнд.

Результатом условного оператора является оцененного операнда — второго или третьего. В условном выражении оценивается только один из последних двух операндов.

Условные выражения имеют ассоциативность справа налево. Первый операнд должен иметь целочисленный тип или тип указателя. Следующие правила применяются ко второму и третьему операндам.

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

  • Если оба операнда являются арифметическими или перечислениями типов, обычные арифметические преобразования (описанные в стандартных преобразованиях) выполняются для преобразования их в общий тип.

  • Если оба операнда имеют тип указателя или один операнд относится к типу указателя, а другой является выражением константы со значением 0, преобразования указателя выполняются с целью преобразования их к общему типу.

  • Если оба операнда имеют ссылочные типы, для преобразования их в общий тип используются ссылочные преобразования.

  • Если оба операнда имеют тип void, общий тип также имеет тип void.

  • Если оба операнда относятся к одному определяемому пользователем типу, общий тип также относится к этому типу.

  • Если операнды относятся к разным типам и по крайней мере один из операндов относится к определяемому пользователем типу, для определения общего типа используются правила языка (см. предупреждение ниже).

Какие-либо сочетания второго и третьего операндов, отсутствующие в предыдущем списке, недопустимы. Тип результата — это общий тип и l-значение, если и второй, и третий операнды имеют один и тот же тип и представляют собой l-значения.

Предупреждение

Если типы второго и третьего операндов не идентичны, вызываются правила преобразования сложных типов в соответствии со стандартом C++. Эти преобразования могут привести к непредвиденному поведению, включая создание и удаление временных объектов. По этой причине мы настоятельно рекомендуем вам (1) либо избегать использования определяемых пользователем типов в качестве операндов в условных операторах, (2) либо, если определяемые пользователем типы все же используются, явно приводить каждый операнд к общему типу.

Пример

// expre_Expressions_with_the_Conditional_Operator.cpp
// compile with: /EHsc
// Demonstrate conditional operator
#include <iostream>
using namespace std;
int main() {
   int i = 1, j = 2;
   cout << ( i > j ? i : j ) << " is greater." << endl;
}

См. также

Операторы C++, приоритет и ассоциативность
Оператор Conditional-Expression