Условный оператор: ? :
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++, приоритет и ассоциативность