前言
本章是对C语言(C89)32个关键字中的部分关键字进行深度剖析以关键字为模块一个一个剖析,当然内容自然不会局限在关键字里
开搞!
程序的运行
#include <stdio.h> int main() { printf("hello world!\n"); return 0; }//回到了起点哈哈哈哈
我们在执行该程序的时候通过预处理章节的知识可以知道我们的编译器通过编译连接等操作将我们的计算机语言转换成可执行程序语言(二进制语言), 然后我们的编译器会将它以文件的形式保存在硬盘中(可以找找在debug文件夹里后缀为.exe的文件就是可执行程序文件)当我们双击可执行文件时, 我们的电脑就将文件中的计算机语言加载到内存中让计算机运行.(当然大部分编译器可以直接运行程序)
也就是说我们程序在运行前需要先加载到内存中才可以被执行
定义和声明
变量是什么
在内存中的某个空间开辟内存用于数据的储存。
定义变量的原因
变量的作用相当于吃饭时的碗,他将我们马上要使用的数据进行储存,方便计算机的读取,从而加速了计算机的运行速度
变量的本质
我们定义变量的本质其实也就是在内存中开辟一个固定的内存来盛放我们的数据
变量的声明
声明不开辟空间只告知.extern 时将内容补齐
auto关键字(很少使用了)
auto是一个很老的关键字了=-=
我们定义在代码块里的变量(及局部变量)默认都是被auto修饰的(都省略了)所以不写倒也没关系
补充知识(可跳过)
讲一下作用域生命周期和代码块的相关知识
代码块:
用{}括起来的区域,就叫做代码块,
局部变量:
在代码块里被声明的变量叫做局部变量, 如果不被static修饰的话局部变量的作用域和生命周期都是在代码块内随着代码块的结束而释放.
全局变量:
在所有函数外(不被任何代码块包含)声明叫做全局变量,全局变量只有程序运行结束才会被释放.
register
注:现在编译器已经十分智能这个关键字也已经很少被使用了.
功能: 将修饰的变量推荐给寄存器,从而使编程速度加快
从推荐二字可以看出register的能力并不强,而且现在的编译器也十分智能了,知道将运算多的变量推荐给寄存器了
补充知识
我们的cpu作为计算的主要硬件,为了方便运算会先将数据从内存读取到CPU中,所以我们的CPU也就要有一些暂时储存的能力.
所以我们的CPU就集成了寄存器来暂时保存数据.
所以寄存器存在的本质是为了加快运行速度因为不需要从内存中读取数值了.
static
首先我们需要先知道,全局变量和函数是可以跨文件使用的(记得声明及extern)
关键字功能
修饰局部变量加长局部变量的生命周期
修饰全局变量使他只能在本文件中使用
修饰函数使他只能在本文件中使用
修饰内容都放在静态区进行保存.
bool类型
C语言有没有bool类型?
c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。
但是c99引入了 _Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了 bool,为了保证C/C++兼容性)。
#include <stdio.h> #include <stdbool.h>//没有这个头文件会报错,使用新特性一定要加上 #include <windows.h> int main() { bool ret = false; ret = true; printf("%d\n", sizeof(ret));//vs2013 & 2019 和 Linux中都是1 system("pause"); return 0; }
下面有个特殊案例
int main() {//在vs中,光标选中BOOL,单击右键,可以看到转到定义,就能看到BOOL是什么 BOOL ret = FALSE; ret = TRUE; printf("%d\n", sizeof(ret)); //输出结果是4,因为在源代码中,是这么定义的:typedef int BOOL; system("pause"); return 0; }
这个特例是是Microsoft也就是微软自己编辑的一个bool类型是只针对微软而创建了所以在使用时只有在微软系统里才可以正常运行.
如在Linux中就会直接报错,而我们在编译代码时为了代码的可移植行不建议使用上面的特殊案例写法
在使用bool类型时
#include<stdbool.h> int main() { int pass = 0;//0表示假,C90,我们习惯用int表示bool //bool pass = false; C99 if (pass == 0) { //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐 //TODO } if (pass == false) { //不推荐,尽管在C99中也可行 //TODO } if (pass) { //推荐 //TODO } //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐 //另外,非0为真,但是非0有多个,这里也不一定是完全正确的 if (pass != 1) { //TODO } if (pass != true) { //不推荐,尽管在C99中也可行 //TODO } if (!pass) { //推荐 //TODO } system("pause"); return 0; }
我们如果使用bool类型不建议使用==
号直接进行判断就好当然使用了也无所谓