C++Primer学习(4.7 条件运算符)

4.7 条件运算符

条件运算符( ? :)允许我们把简单的if-else逻辑嵌入到单个表达式当中,条件运算符按照如下形式使用:

cond ? exprl : expr2;

其中cond是判断条件的表达式,而expr1和expr2是两个类型相同或可能转换为某个公共类型的表达式。条件运算符的执行过程是:首先求cond的值,如果条件为真对expr1求值并返回该值,否则对 expr2求值并返回该值。举个例子,我们可以使用条件运算符判断成绩是否合格:

cpp 复制代码
string finalgrade=(grade<60)?"fail":"pass";

条件部分判断成绩是否小于60。如果小于,表达式的结果是"fail",否则结果是"pass"。有点类似于逻辑与运算符和逻辑或运算符(&&和I|),条件运算符只对expr1和expr2中的一个求值。

当条件运算符的两个表达式都是左值或者能转换成同一种左值类型时,运算的结果是左值:否则运算的结果是右值。
嵌套条件运算符

允许在条件运算符的内部嵌套另外一个条件运算符。也就是说,条件表达式可以作为另外一个条件运算符的cond或expr。举个例子,使用一对嵌套的条件运算符可以将成绩分成三档:优秀(highpass)、合格(pass)和不合格(fail):

cpp 复制代码
finalgrade=(grade>90)?"high pass"
:(grade<60)?"fail":"pass";

第一个条件检查成绩是否在90分以上,如果是,执行符号?后面的表达式,得到"highpass";如果否,执行符号:后面的分支。这个分支本身又是一个条件表达式,它检查成绩是否在60分以下,如果是,得到"fai1";否则得到"pass"。

条件运算符满足右结合律 ,意味着运算对象(一般)按照从右向左的顺序组合。因此在上面的代码中,靠右边的条件运算(比较成绩是否小于60)构成了靠左边的条件运算的:分支。

WARNING:随着条件运算嵌套层数的增加,代码的可读性急剧下降。因此,条件运算的嵌套最好别超过两到三层。
在输出表达式中使用条件运算符

条件运算符的优先级非常低,因此当一条长表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。例如,有时需要根据条件值输出两个对象中的一个,如果写这条语句时没把括号写全就有可能产生意想不到的结果:

cpp 复制代码
cout<<((grade<60)?"fail":"pass");//输出pass或者 fail
cout <<(grade<60)?"fail":"pass";//输出1或者0!
cout<<grade<60?"fail":"pass";//错误:试图比较cout和60

在第二条表达式中,grade和60的比较结果是<<运算符的运算对象,因此如果grade<60为真输出1,否则输出0。<<运算符的返回值是cout,接下来cout作为条件运算符的条件。也就是说,第二条表达式等价于

cpp 复制代码
cout<<(grade<60);//输出1或者0
cout ?"fail":"pass"; //根据cout的值是true 还是 false 产生对应的字面值

因为第三条表达式等价于下面的语句,所以它是错误的:

cpp 复制代码
cout << grade;//小于运算符的优先级低于移位运算符,所以先输出grade
cout<60?"fail":"pass";//然后比较 cout和 60!
相关推荐
虾球xz1 小时前
游戏引擎学习第276天:调整身体动画
c++·学习·游戏引擎
虾球xz1 小时前
游戏引擎学习第275天:将旋转和剪切传递给渲染器
c++·学习·游戏引擎
qq_386322692 小时前
华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)
前端·网络·学习
J先生x2 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
虾球xz6 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
fpcc6 小时前
跟我学c++高级篇——模板元编程之十三处理逻辑
c++
Y3174296 小时前
Python Day23 学习
python·学习
格林威7 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
song_ly0017 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
DIY机器人工房8 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技