C--深度剖析--关键字(4)

if、else组合

if和else是分支的基础,我们先来清楚一点
C语言中一个分号;就是一条语句,把各种操作符连起来就是表达式。
那么if语句的结构是什么样子的呢?
if(表达式)
{
语句;
}
当然还有else分支、还有多分支、还有嵌套等等。

那我们需要清楚的知道:
if语句循环的时候,第一步,要先执行表达式,得到结果;第二步再进行判定逻辑结果;最后一步才是执行分支中的语句。
解释一下逻辑结果:0为真,非0为假。

其中比较重要的还有一个问题
else和哪个if匹配呢?

在这里插入图片描述
这段代码很好的说明了,在没有花括号限定的前提下,我们的else匹配和他最近的if,这里什么都不会输出的。

我们一定不要写出这样的代码,该带括号的地方就带上括号,哪怕是空代码块,养成良好的代码规范。

还有一个比较有趣的例子:
在这里插入图片描述
想不到这样的代码还能执行出来吧。要小心哦。

bool类型

我们首先要知道一件事情,C语言中(我们大量使用的c90),是没有bool这个关键字的,c99之后才有的。
c99中的bool类型是什么样的呢?首先它长这个样子
_Bool
不过为了和C++兼容,它在新增的头文件stdbool.h中被重新宏定义成了bool。
因为c++中有bool这样的类型。

所以我们知道,在使用这种新特性的时候,一定要加上这样的头文件。

我们还要明白一点
sizeof(bool)算出来都是 1 个字节

大家可以看看这段源码
在这里插入图片描述
当我们不使用新的特性,而是使用c90中的BOOL,我们可以再进行测试
sizeof(BOOL),结果是4个字节。
因为微软有自己的一套BOOL值,转到定义我们可以看到这样的代码
typedef int BOOL;
微软把bool定义成了int

这应该是一个很严重的问题,我们要保证代码的跨平台性。
BOOL这样的关键字再linuxg++下是完全编译不过去的,
相反bool这样的新特性可以再linux和windows相互使用。

所以我们总结一下:
在以后使用bool时推荐使用C99头文件下的,不要使用微软的BOOL。
可以不使用bool时,优先使用C90、C89,因为这个版本是主流。

bool值和0的比较

我们一般使用if时,都比较推荐这样的写法
if(pass)
if(!pass)
而不推荐
if(pass == 0)理论上是可行的,但这个时候pass被当作bool值,而非int, = =这样的等式一般用来比较整数。虽然pass再c90下就是int,但我们不推荐。
if(pass == false) 这也是不推荐的,这样也太别扭了。

if (pass != 1)
if(pass != true)
这种的都不推荐,最开始两种写法是推荐的。

总结一下:bool和0比较的时候,我们直接得到逻辑结果,直接判定,不用操作符进行和特定值比较和计算。这真是很简单了。但是很容易理解错误。

float和0值的比较

这里比较复杂,想要清楚更多细节可以先去深挖一下浮点数在内存中的存储原理。
我们只需要粗浅的知道,浮点数在内存中存储的时候,他不是完整的存储,十进制变为二进制时,会有精度损失。这里的精度损失不是损失,他有可能变大也有可能变小。
浮点数计算和存储的时候会有一些类似于四舍五入或者其他的策略。
总而言之,它存储会损失精度,不能完美存储。
举个例子
在这里插入图片描述
我们先看看float和float之间的比较

在这里插入图片描述
我们发现,1-0.9竟然不等于0.1了,就是因为存储精度的问题。那我们还怎么敢这样比较两个浮点数呢?这样的比较方法对于计算机来说显然是不对的。
所以我们得到一个普适性的结论:
因为精度损失,两个浮点数之间坚决不能用双等号来比较。

那我们该如何比较两个float呢?
直接告诉大家结论:
if(fabs(x-y)< 精度)
其中精度是我们可以自己设置,通常用宏定义。
这里暂时推荐大家使用系统精度
在这里插入图片描述
在这里插入图片描述

当然了,想用fabs求绝对值,还需要加上math.h


那我们正式开始和0比较吧
其实已经把普适讲了,那么和0比较就如下了
if( fabs(a) < DBL_EPSILON )
这个条件成立就意味着和a == 0;
在这里插入图片描述
以后和0比较就可以用这样的方法比较了。
但是这里还有一个问题
我们比较的时候要不要相等呢?
fabs(x) <= DBL_EPSILON

这时候我们要重新认识一下精度
XXX_EPSILON 是最小误差
解释一下:XXX_EPSILON +n 不等于n的最小正数。
再解释一下:就是能改变一个数n的最小值。

其中EPSILON 这个单词翻译过来是 “ε ”,数学上就是极小的正数。 这个数学符号高考的时候都见过吧,高数里也有ε语言证明之类的。

既然
EPSILON+ n != n ; (定义)
0.0+n == n (定义) 解释一下这一行,0加上任何数等于任何数本身,这是定理。

那么既然如此,我们fabs(x) = DBL_EPSILON 这条语句是判断x是否等于0 的,如果 有=,就说明x本身(这时候x已经是代表精度了,因为加了=),已经能够引起其他 和他±的数的变化了,这个数就不符合0的概念了。听不懂就算了,但是不建议大家写等号。

把以上这几点搞明白了,以后浮点数和0比较就有把握了吧!

指针和0比较

这个很简单
我们首先要知道三个 “零”
0 \0 NULL
他们三个在数字上是完全一样的,但是他们的类型是不同的。

比如我们这样理解:
int a = 0;
char * p = NULL;
他们两个其实在比特位层面是完全一样的,那就是清零。
那为什么不直接给指针赋0呢?(注意:这里实质上并不出错,但是有的编译器会进行报警。vs环境下没有问题)
我们需要明白的一点是,“=”“+”“-”等赋值操作符在使用时,必须两侧的类型相等,否则会发生警报。
但是我们程序员会觉得怪怪的。

NULL是怎么变成0的呢?
在这里插入图片描述

其实很简单,就是进行了宏定义的强制类型转换而已。

那 ‘\0’该怎么理解呢?
首先我们要知道如果去掉反斜杠\,那么‘0’这个是字符0,它对应的ascll码为48.关于转义的概念,我们在关键字学习完之后,会详谈。

我们现在来理解一下上面NULL的强制类型转换
出一道题:
“123456” 转化成 int 123456

首先前面的字符串有7个字节,int不管你几位就4个字节
那应该怎么转呢?我们需要编写算法使用库函数(先不讲,挖个坑)
以上应该用真实的转换,而非强转,我们具体看看强制类型转换。
今天有一个二进制数:1111 1111
我今天告诉你它是一个 unsigned 类型,那你一下会认为它是一个非常大的数
我过两天我再告诉你这是要给signed类型,啊,那他在你眼里就是要给负数了。
大家反应过来了吗?强制类型转换和我们之前讲的数据存取是一个道理,他在内存中的数据是没有变化的,只是改变了解释的方法。

而上面那道题中的真实的转换,是真的改变内存的数据的转换,所以称之为真实的转换。

我们回到主题,指针如何和0进行比较呢?
int * p = NULL
if(p!= 0) if(p== 0)
if(p) if(!p)
if(NULL == p) if(NULL != p)
我们推荐第三种写法,我们一眼一看就是指针的比较
而第一种如果我们没有看到p是个指针,它的比较是很不确定的
第二种的逻辑是反的,也容易造成误解。因为P为空,是不执行的。
所以我们只是推荐第三种哦,具体怎么选都可以的。

当然为什么我们不写 p == NULL呢?
因为很多新手比如我写代码 条件判断时 误写成 if(p = NULL)那在编译期间会产生错误。
那有人说,那还可能写成NULL=p呢?这样大家可以试一下,错误直接就显示出来了。
我们写代码要有一个原则:错误越早出现越好。

switch与case

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值