> 文章列表 > C语言深度剖析:关键字

C语言深度剖析:关键字

想要真正精通C语言,关键字是你的得力助手!它们就像是代码中的魔法词,每个都有独特的能力和小秘密。比如说,auto这个关键字,就像是给变量设定了“限时魔法”,变量在块级作用域外就会消失,现在都用它当隐形冠军了!还有register,它是个性能怪兽,建议把变量放在CPU寄存器里,但别滥用,寄存器可是很珍贵的哦!

想搞明白内存是怎么存整数的?补码可是计算机界的“万能胶”,解决了负数运算的大麻烦,让你在编程时少走弯路。至于static,它是个“独行侠”,能让变量或函数只在当前文件里生效,简直是隐私保护大师!

最后,浮点数比较一定要注意,不能直接用“==”!用一个小数值范围(比如0.0000001)来判断接近即可,这样程序才不会被坑。总之,这些关键字就像是编程世界的隐藏技能,掌握它们,让你的代码更高效、更优雅!

C语言深度剖析:关键字

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个关键字整体上来总结复习一遍就是我们的目的

C语言深度剖析:关键字

定义与声明(补充内容)

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语言操作符大全

在讲操作符时有详细说明,不再赘述。

C语言深度剖析:关键字

大小端补充

数据低位放在低地址处则为小端,口诀小小小。不符合则为大端。

理解变量内容的存储和取出

数据存入时和类型无关,存入二进制即可,取出时才看类型。

为什么都是补码

计算机在存储数据都是二进制,原因:

1.CPU内只集成了加法器,只有补码才能解决减法问题。

2.补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

整型取值范围

记住char类型有符号-128~127,无符号0 ~255(理解怎么计算)。

C语言深度剖析:关键字

关于if判断的问题

例如语句:if(flag==1),从正常逻辑上来讲我们通常想的是如果flag==1,则…,但是实际上如果更系统地来描述的话,应该是

先计算括号内的表达式逻辑值,然后进行判断。

bool变量

布尔变量,C99中引入的概念,由于我们目前仍主要按C89/C90标准,所以使用并不多,但是不能一口咬死C语言没有bool类型。

_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性 。

bool a=0;sizeof(a);可以求出布尔变量的大小,理论上来讲表示真假一个字节就可以,但是具体还是取决于编译器。

C语言深度剖析:关键字

但是还有一个全部大写的BOOL,TRUE,FALSE,

C语言深度剖析:关键字

这是在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