条件运算符基础
操作符 | 符号 | 形式 | 含义 |
---|---|---|---|
条件运算符 | ?: | c ? x : y | 如果条件 c 为真,则求值 x ,否则求值 y |
条件运算符 (?:
)(有时也称为算术 if 运算符)是一个三元运算符(接受 3 个操作数的运算符)。由于它在历史上是 C++ 唯一的三元运算符,因此有时也被称为"三元运算符"。
?:
运算符提供了一种执行特定类型 if-else
语句的简写方法。
相关阅读
我们将在课程 [4.10 – 介绍 if 语句] 中介绍 if-else
语句。
回顾一下,一个 if-else
语句采用以下形式:
if (condition)
statement1;
else
statement2;
如果 condition
求值为 true
,则执行 statement1
,否则执行 statement2
。else
和 statement2
是可选的。
?:
运算符采用以下形式:
condition ? expression1 : expression2;
如果 condition
求值为 true
,则求值 expression1
,否则求值 expression2
。:
和 expression2
是不可省略的。
条件运算符示例
考虑一个如下所示的 if-else
语句:
if (x > y)
max = x;
else
max = y;
这可以改写为:
max = ((x > y) ? x : y);
在这种情况下,条件运算符可以帮助紧凑代码而不损失可读性。
完整示例
考虑以下示例:
#include <iostream>
int getValue()
{
std::cout << "Enter a number: ";
int x{};
std::cin >> x;
return x;
}
int main()
{
int x { getValue() };
int y { getValue() };
int max { (x > y) ? x : y }; // 使用条件运算符求最大值
std::cout << "The max of " << x <<" and " << y << " is " << max << ".\n";
return 0;
}
条件运算符的高级用法
作为表达式的一部分
由于条件运算符是作为表达式的一部分进行求值的,因此它可以用于任何接受表达式的地方。在条件运算符的操作数是常量表达式的情况下,条件运算符可以用于常量表达式中。
例如,在初始化变量时:
#include <iostream>
int main()
{
constexpr bool inBigClassroom { false };
constexpr int classSize { inBigClassroom ? 30 : 20 }; // 在常量表达式中使用条件运算符
std::cout << "The class size is: " << classSize << '\n';
return 0;
}
条件运算符的括号使用
因为 C++ 将大多数运算符的求值优先级置于条件运算符之上,所以很容易写出使用条件运算符但求值结果不符合预期的表达式。
最佳实践 (Best practice)
当在复合表达式中使用时,给整个条件运算(包括操作数)加括号。
为了可读性,如果条件包含任何运算符(函数调用运算符除外),考虑给条件加括号。
类型匹配和转换
为了符合 C++ 的类型检查规则,以下情况之一必须成立:
- 第二个和第三个操作数的类型必须匹配。
- 编译器必须能够找到将第二个和第三个操作数中的一个或两个转换为匹配类型的方法。
例如:
#include <iostream>
int main()
{
std::cout << (true ? 1 : 2) << '\n'; // 正确:两个操作数都有匹配的 int 类型
std::cout << (false ? 1 : 2.2) << '\n'; // 正确:int 值 1 转换为 double
std::cout << (true ? -1 : 2u) << '\n'; // 令人惊讶的结果:-1 被转换为 unsigned int,结果超出范围
return 0;
}
使用建议
最佳实践场景
条件运算符在以下情况中最有用:
- 用两个值中的一个初始化对象。
- 将两个值中的一个赋值给对象。
- 向函数传递两个值中的一个。
- 从函数返回两个值中的一个。
- 打印两个值中的一个。
最佳实践 (Best practice)
在复杂的表达式中最好避免使用条件运算符。