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

本文详细讲解了C语言中if-else组合、bool类型的使用(包括与0和浮点数的比较)、指针与0的比较,以及switch与case的注意事项。重点介绍了如何正确地进行布尔逻辑判断和避免常见误区。

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

当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值