首先我们来了解C语言一共有多少个关键字呢?
在我们一般书籍的介绍中,一共有32个关键字,这些是基于C90(C89)的标准,但是在后面的C99标准中新增了5个关键字,不过目前主流的编译器其实对C99的支持并不友好,所以暂时可以先不了解。
1、变量的认识
1.1变量的声明和定义
定义变量的本质:在内存中开辟一块空间,用来保存数据。
如何定义变量相信大家都知道了,这个我就不细说了,但是我发现有的学校老师写main函数的时候返回值为void或者直接不写返回值,这样有错吗?其实严格意义上这是不规范的写法的!(C/C++标准规定main 函数的返回值应该定义为 int 类型)如果现在有的书上还是void main我建议你考虑扔掉那本书🤪,那么标准的main函数的写法是什么呢?见代码:
其实这里你 return 1; 或者任何数都没问题包括负数编译器都不会报错,但是,我们C语言从开始到现在以来,已经约定了规矩,如果程序是异常结束则返回非0值,程序正常结束则返回0!就像我们去任何一个地方要尊重当地的习俗一样!
接着我们来理解变量的声明:
这里我给大家简单举一个例子,张三喜欢上了隔壁学院的小美,在某一天晚上张三鼓起勇气跟小美告白,于是小美成为了张三的女朋友,这就叫做定义!那么张三晚上回寝室特别开心,他把这个消息告诉了室友李四,也告诉了隔壁寝室的王五,甚至还打电话告诉了她的妈妈,张三给任何人声明小美就是他女朋友,那么这就叫做声明!
声明可以有多次,代码块内定义只能有一次!(详细内容放在extern讲解)
1.2全局变量和局部变量
变量我们可以分为局部变量和全局变量:
局部变量:包含在代码块中的变量叫局部变量,同时局部变量具有临时性,当它进入代码块的时候会自动开辟空间,退出代码块会自动释放。
全局变量:在所有函数外定义的变量叫做全局变量,全局变量具有全局性,声明周期从整个进程开始到进程结束。
1.2变量的作用域和生命周期
变量的作用域:指的是该变量的可以被正常访问的代码区域!
变量的生命周期:指的是该变量从定义到被释放的时间范围!
*局部变量:进入代码块,形成局部变量到退出代码块
*全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有
这里我们先简单了解概念,讲static关键字会带入进去以上概念。
2、跑的飞快 --------- register(理解)
见名知意,为什么叫跑的飞快,让然是非常快!首先我们先来看一幅图:
在我们先认识register这个关键字之前先了解一个概念,计算机中CPU是主要负责进行计算的硬件单元,但是为了运算方面,我们一般要先把数据硬盘读取到内存中,再从内存中读取到CPU内,那么CPU也就需要一定的数据临时存储能力,所以现代的CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存,那么我们如果把变量放在寄存器中,不用通过从内存中读取这个步骤的话是不是会更快呢?
寄存器存在的本质:在硬件层面上,提高计算机的运算效率。因为不需要从内存读取数据!
用register修饰变量:尽量将所修饰的变量放到CPU寄存器中,从而达到提高效率的目的!
那么所有变量适合采用register修饰吗?并不是!
- 局部变量(全局变量会导致CPU寄存器长时间被占用)
- 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?)
- 需要高频被读取的(提高效率所在)
建议:如果要使用,请不要大量使用,因为寄存器数量有限!
来到这里我们要注意一个问题,既然被register修饰的变量会被放到CPU寄存器中,那么它还可以进行取地址操作吗???
这里我们win vs编译器的环境下显然是不可以的!
为什么呢?因为地址是内存上的概念。(其他环境未测试)。
最后:这个关键字在目前来看,已经不重要了,主流的编译器已经很智能了,能够进行比人更好的代码优化,我们只需要了解即可。