一、if~else语句的执行过程
if()语句到底是怎么执行的,你知道吗?很多人或许都会说if()语句不就是看()里面的语句是真还是假吗?为真就执行紧跟着if()后面的语句,为假就再判断后面的分支语句。其实不然,if~else语句的执行过程实际上是可以分为三步的。
一、先执行()中的表达式,得到真假逻辑结果。(无论什么情况都是优先算括号里面的表达式得到一个真假结果的)
二、进行条件判定功能,即判断得到的逻辑结果是真还是假。
三、进行分支功能,即如果逻辑结果为真就执行紧跟在if()后面的语句,否则就往下判断。
这里强调一点,很多人都忽略了if()语句的判定功能的,但其实判定功能是存在的,是先执行判定功能再执行分支功能的。
二、几个数据与零值比较的注意事项
1、bool与零值比较
在这里先问大家一个问题,C语言中存在布尔类型(true与false)吗?可能很多人在大多数C语言的书上是找不到布尔类型的,所以认为C语言是不存在布尔类型的,确实在C89和C90标准中确实不存在布尔类型,但是在最新的C99标准中C语言引入了_Bool的宏定义,即C99标准中是存在布尔类型的。因为书是落后于行业的,所以C语言书中没找到是很正常的。
下面我们就来聊聊bool和零值比较的注意事项。
2、float与零值比较
(1)浮点数在数据存储的时候有精度损失
我们先来看看一张图。
在这张图中你会发现,明明创建的double变量是3.6,但是打印出来的时候后面却多出来了一些小数,这是什么原因呢?这里是因为在数据存储发生了精度损失了(注意精度损失不一定是变小了的哦,也有可能变大了)。
我们再来看以下这张图。
按照常规来说打印出来的两个数应该是一样的,但是这样看来他们并不一样啊,所以这里也能证明数据存储是有精度损失的。
(2)浮点数比较绝对不能用“==”
我们看:
这里按照正常来说肯定是打印you can see me的啊!但是通过现象可以看出结果并不是如你所愿的,通过以上可以得出一个很重要的结论就是:**浮点数在进行比较的时候,绝对不能直接使用==来进行比较的,因为浮点数的存储本身有精度损失,进而导致的各种结果可能有细微的差别,因为对于计算机的计算来说,即使是只有一点点的差别都是不一样的!!!(切记)。
**那我们该如何进行浮点数的比较呢?
(3)浮点数的比较需要用一个在误差范围内的区间比较
当然这个误差范围可以根据实际需要定义,也可以使用编译器自带的那换个误差范围值。
而我们要用x与零值比较,那么我们应该像下图这样写:
(4)要不要取“=”号细节
这里我们还需要再讨论一下一个很小的细节,那就是这里要不要写成fabs(x)<=ESP,就是说这里的等于号到底要不要取的问题,相信大家在很多的C语言的书中看到的写法都是带上=号的,但是真的要带上=号吗?我们看下图:
3、指针变量与零值比较
那么指针变量和零值比较又是以什么样的形式呢?