C语言深度剖析:关键字
想要真正精通C语言,关键字是你的得力助手!它们就像是代码中的魔法词,每个都有独特的能力和小秘密。比如说,auto这个关键字,就像是给变量设定了“限时魔法”,变量在块级作用域外就会消失,现在都用它当隐形冠军了!还有register,它是个性能怪兽,建议把变量放在CPU寄存器里,但别滥用,寄存器可是很珍贵的哦!
想搞明白内存是怎么存整数的?补码可是计算机界的“万能胶”,解决了负数运算的大麻烦,让你在编程时少走弯路。至于static,它是个“独行侠”,能让变量或函数只在当前文件里生效,简直是隐私保护大师!
最后,浮点数比较一定要注意,不能直接用“==”!用一个小数值范围(比如0.0000001)来判断接近即可,这样程序才不会被坑。总之,这些关键字就像是编程世界的隐藏技能,掌握它们,让你的代码更高效、更优雅!
C语言深度剖析:关键字
- C语言深度剖析:关键字
-
- 前言
- 定义与声明(补充内容)
- 最宏大的关键字-auto
- 最快的关键字-register
- 关键字static
- 被冤枉的关键字-sizeof
- 整型在内存中的存储
-
- 原码、反码、补码
- 大小端补充
- 理解变量内容的存储和取出
- 为什么都是补码
- 整型取值范围
- 关于if判断的问题
- bool变量
-
- bool变量和零值的比较
- float类型数据的比较
-
- float变量与零值的比较
- 不安全函数问题
- switch语句的小细节
- 三大循环中的细节
- 打破对goto语句的偏见
- void的一些细节
-
- void*的运算操作
- 关于return的细节
-
- return怎样将值返回
- const使用的几种场景
-
- const修饰普通变量
- const修饰数组
- const修饰指针
- const修饰函数
- volatile-最易变的关键字
- struct关键字
-
- 柔性数组
- union关键字
- enum枚举类型
- typedef关键字
-
- typedef和#define宏的区别
- 总结
-
- 数据类型关键字12个
- 控制语句关键字12个
- 存储类型关键字5个
- 其他关键字3个
C语言深度剖析:关键字
前言
本篇内容既是对之前C语言学习的重点复习内容,也是对之前内容的补充,大体内容逻辑参考了《C语言深度解剖》这本书,所以这节内容更像是个对C语言学习的一个重点内容复盘,也就是将C语言重点知识重新串一遍,同时也对之前一些掌握不太好的知识的补充。所以下面几乎都是一个一个的知识点,友情提示:不是很适合零基础的同学。基础不太好的请将C语言的基础内容部分系统进行学习。
主要将C89/C99标准的主要的32个关键字整体上来总结复习一遍就是我们的目的
定义与声明(补充内容)
1.程序运行,需要加载到内存中
2.程序计算,需要使用变量
定义变量的本质:在内存中开辟一块空间,用来保存数据。
变量声明:extern关键字,声明一个变量或函数已经存在,可以改变其作用域。
变量初始化与赋值:
变量的初始化:在为变量开辟空间的同时将数据存放进去
变量的赋值:将数据放入已经开辟好的空间里面
最宏大的关键字-auto
auto这个关键字是只能用来修饰局部变量的,意思就是表示局部变量只能在其所在的代码块内有效,出代码块则销毁。也就是限制了局部变量的生命周期,auto已经是一个非常原始的关键字了,由于现在编译器已经很智能的解决这些了,所以已经不再需要它了。
最快的关键字-register
register:建议将变量放入寄存器中
那么什么样的变量,可以采用register呢?
1.局部的(全局会导致CPU寄存器被长时间占用)
2.不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
3.高频被读取的(提高效率所在)
4.如果要使用,请不要大量使用,因为寄存器数量有限
关键字static
修饰全局变量:只能在文件内部使用,改变了作用域
修饰局部变量:相当于改变了声明周期
修饰函数:只能在文件内部使用,相当于改变了作用域
被冤枉的关键字-sizeof
首先记住sizeof不是函数,不是函数,不是函数!!!
三种写法:
sizeof(int)
sizeof(a)
sizeof a
sizeof(i++)
内部i不会自增。
整型在内存中的存储
原码、反码、补码
C语言操作符大全
在讲操作符时有详细说明,不再赘述。
大小端补充
数据低位放在低地址处则为小端,口诀小小小。不符合则为大端。
理解变量内容的存储和取出
数据存入时和类型无关,存入二进制即可,取出时才看类型。
为什么都是补码
计算机在存储数据都是二进制,原因:
1.CPU内只集成了加法器,只有补码才能解决减法问题。
2.补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
整型取值范围
记住char类型有符号-128~127,无符号0 ~255(理解怎么计算)。
关于if判断的问题
例如语句:
if(flag==1)
,从正常逻辑上来讲我们通常想的是如果flag==1,则…,但是实际上如果更系统地来描述的话,应该是先计算括号内的表达式逻辑值,然后进行判断。
bool变量
布尔变量,C99中引入的概念,由于我们目前仍主要按C89/C90标准,所以使用并不多,但是不能一口咬死C语言没有bool类型。
_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性 。
bool a=0;sizeof(a);
可以求出布尔变量的大小,理论上来讲表示真假一个字节就可以,但是具体还是取决于编译器。
![]()
但是还有一个全部大写的BOOL,TRUE,FALSE,
![]()
这是在VS中看到的源文件,微软自己搞出的一套定义,不要使用,为了保证代码的可移植性。
bool变量和零值的比较
bool变量与零值的比较有多种方法,例如if(pass==true);if(pass= =0);if(pass= =false);(pass为一个布尔变量),但是这样的写法都不推荐,我们推荐以下两种写法:
if(pass);
if(!pass);
float类型数据的比较
关于浮点型数据存储的细节不再赘述,链接:C进阶:数据在内存中的存储
很多浮点型数据在内存中不能够精确存储,因此一定不能将两个浮点数直接比较,例如
if(a==0.2)
,这是绝对不能正确判断的,正确判断两个浮点数存储的方式是定义一个宏EPS,假设为0.0000001,如果fabs((a-0.2))<EPS
,fabs是一个函数取绝对值,意思就是只要差值在一定范围内则视为相等。下面举一个完整的代码例子:#define EPS 0.00000000001