C++中0 < x < 10语法的实际作用是什么?为何与逻辑与表达式不等效?
为什么
0 < x < 10和0 < x && x < 10完全不等价? 兄弟,我太懂你这种踩坑的憋屈感了!之前我也想当然觉得0 < x < 10这种数学里的写法,在代码里和0 < x && x < 10是一个意思,直到写代码出了莫名其妙的bug才幡然醒悟——而且更坑的是编译器居然还能通过编译,根本不给提示,简直防不胜防!
你写的这段代码:
if (0 <= grade < 59) letter = 'F'; else if (60 <= grade < 69) letter = 'D'; else if (70 <= grade < 79) letter = 'C'; else if (80 <= grade < 89) letter = 'B'; else ...
之所以达不到你想要的成绩分级效果,核心原因是C/C++这类语言的表达式计算顺序是从左到右的,而且比较运算的结果是布尔值(对应整数1或0)。
拿0 <= grade < 59来说,它的执行步骤是:
- 先计算左边的
0 <= grade,这个比较会返回一个布尔值:如果grade满足条件,返回true(也就是整数1);不满足就返回false(整数0)。 - 然后用第一步得到的结果(1或0)去和59做
<比较,也就是变成1 < 59或者0 < 59——这两个比较的结果都是true!
所以不管grade是多少(哪怕是100),第一个if的条件都会成立,直接把letter设成'F',后面的else if分支根本不会被执行,这就是你程序出错的根源。
而你原本期望的逻辑,必须用逻辑与运算符&&来实现,比如:
if (0 <= grade && grade < 59) letter = 'F'; else if (60 <= grade && grade < 69) letter = 'D'; else if (70 <= grade && grade < 79) letter = 'C'; else if (80 <= grade && grade < 89) letter = 'B'; else ...
这样才会先判断grade是否在对应区间内,两个条件同时满足时才会执行对应的分支,完全符合你的成绩分级需求。
内容的提问来源于stack exchange,提问作者Star Light
相关产品推荐
相关产品推荐

