C++中使用条件运算符进行条件处理

C++中使用条件运算符进行条件处理

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++后台高级服务器课程

你可能感兴趣的:(C++编程基础,c++)