Условный оператор: ?:
Синтаксис
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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по