C++提供了一个有趣且功能强大的运算符—条件运算符,它相当于紧凑的 if-else 结构。
条件运算符也叫三目运算符,因为它使用三个操作数:
(conditional expression evaluated to bool) ? expression1 if true : expression2 if false;
条件运算符 (?:) 是三元运算符, (它采用三个操作数) 。 条件运算符按以下方式运行:
第一个操作数将隐式转换为 bool 。 计算该操作数,并在继续前完成所有副作用。
如果第一个操作数的计算结果为 true (1) ,则计算第二个操作数。
如果第一个操作数的计算结果为 false (0) ,则计算第三个操作数。
条件运算符的结果是操作数(无论是第二个还是第三个)的计算结果。 只有最后两个操作数之一在条件表达式中计算。
条件表达式具有从右到左的关联性。 第一个操作数必须是整数或指针类型。 以下规则适用于第二个和第三个操作数:
如果两个操作数是相同的类型,则结果也是该类型。
如果两个操作数都是算术或枚举类型,则执行 标准转换 (中涵盖的常用算术转换) 将它们转换为通用类型。
如果两个操作数都是指针类型,或者一个是指针类型,另一个是计算结果为 0 的常量表达式,则执行指针转换来将它们转换为通用类型。
如果两个操作数都是引用类型,则执行引用转换来将它们转换为通用类型。
如果两个操作数都是 void 类型,则通用类型是 void 类型。
如果两个操作数是相同的用户定义类型,则通用类型也是该类型。
如果操作数是不同的类型,而且至少有一个操作数是用户定义类型,则使用语言规则来确定通用类型。 (请参阅下面的警告。)
前面列表中没有的第二个和第三个操作数的任意组合都是非法的。 结果的类型是通用类型,如果第二个和第三个操作数是同一类型且都是左值,则结果为左值。
可使用这个运算符获得两个数字中较大的那个:
int max = (num1 > num2)? num1 : num2; // max contains greater of num1 and num2
以下示例程序演示了如何使用运算符?:进行条件处理:
#include
using namespace std;
int main()
{
cout << "Enter two numbers" << endl;
int num1 = 0, num2 = 0;
cin >> num1;
cin >> num2;
// use a conditional operator ?:
int max = (num1 > num2)? num1 : num2;
/* Similar to -
int max = 0;
if (num1 > num2)
max = num1;
else
max = num2;
*/
cout << "The greater of " << num1 << " and " \
<< num2 << " is: " << max << endl;
return 0;
}
输出:
Enter two numbers
365
-1
The greater of 365 and -1 is: 365
分析:
需要注意的是第 10 行。它包含一条非常紧凑的语句,该语句判断输入的两个数字那个更大,与下述使用 if-else 的代码等效:
int max;
if (num1 > num2)
max = num1;
else
max = num2;
使用条件运算符可节省几行代码!但不应将节省代码放在首位。有些程序员很喜欢条件运算符,而有些不喜欢。使用条件运算符时,确保代码易于理解至关重要。
应该:
务必将枚举量用作 case 标签,以提高代码的可读性。
务必提供 default 标签,除非完全没有必要。
务必在每条 case 语句中包含 break。
不应该:
不要包含两个标签相同的 case 语句,这既不符合逻辑,也无法通过编译。
务必不要使用没有 break 的 case 语句,也不要依赖于 case 语句的顺序,这会让 swtich-case 结构过于复杂。另外,如果以后不小心调整了 case 语句的顺序,代码可能不再可行。
使用条件运算符( ?:)时,不要使用复杂的条件和表达式。
提示:
C++17 有望使用 if constexpr 引入条件编译,还可能在 if 和 switch 语句中引入初始化功能。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程