目录
1.提出问题
看到了一个有意思的代码
#include<stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(60<=score<=100)
{
printf("及格\n");
}
if(0<=score<60)
{
printf("不及格\n");
}
return 0;
}
这是一个判断成绩是否及格的代码,乍一看彷佛没有什么问题,但是运行一下
2.解决问题
问题有点大,45分怎么既及格又不及格?其实问题就出现在60<=score<=100 这句话里,因为c语言是不可以这样连续判断的,如果想要连续判断,得使用逻辑运算符 且: &&
比如:60<=score<=100得写成0<=score && score<=100
代码修改后结果如下:
3.分析问题
为什么写出 if(60<=score<=100) 这种代码,还能正确编译不报错,代码还能正常运行,结果却不对?那就回到if的执行条件来。
我们知道:if(flag){代码}如果flag为true(真),将执行后面的代码,如果flag为false(假),则不执行。
一般true对应的整形值为1,false对应的为0
两个数做判断比较会返回一个bool类型的值(即ture或者false)
如果三个数字连续作比较会发生什么?
由图可知:都为true ,为什么会这个样子?
因为c语言的连续判断,都是从左往右执行的!!!
a<x<b 先拿a<x比较是否成立,然后得到0或者1拿去和b作比较
比如 2<1<3
他会首先判断2<1,返回结果为false(即0)然后把结果再继续和后面作比较:0<3当然为真,所以返回true(即1)
实践是检验真理的唯一标准!为了验证这个猜想,我又做了以下及格测试
所以回到最开始的问题 :为什么输入45会输出及格
因为:if(60<=score<=100)
执行顺序如下:
首先输入45赋值给score
60<=45显然不成立,返回0, 拿0和100作比较0<=100显然成立返回1
所以if里的是真命题,代码执行输出及格。
同理0<=45为真返回1,1<60为真返回1,代码执行,输出不及格