关键字是编译器预先定义好的有一定意义的字符串,c语言有32个关键字。C语言的关键字分为:(1)数据类型关键字;(2)逻辑结构关键字;(3)类型修饰符关键字;(4)自定义类型关键字;(5)杂项
一:数据类型关键字
从c语言角度理解计算机由三个组件组成1、cpu;2、资源;3、连接cpu和资源的数据总线和地址总线。c语言操作的对象是资源也就是内存(包含LCD缓存、.....),那么在c语言中就需要对这些资源的属性进行描述,资源的属性很多,其中一个属性为资源的大小,在c语言中数据类型关键字可以描述资源的大小。
1、char
硬件芯片操作的最小单位为bit,软件操作的最小单位为char,软件如果操作的最小单位是bit,那么软件开发的成本将会很大,因此软件操作的最小单位为char。应用场景:在需要硬件处理最小单位时,使用char,硬件对字符串的发送接收。
2、int,long,short
int占用的字节大小由编译器决定,int是编译器最优处理的大小,也是系统一个周期能够接受的最大处理单位,等于数据总线的最大容量。long和short是对int的补充,需要特殊长度限制时使用。
3、unsigned、signed
数据使用无符号数,数字使用有符号数。如,摄像头采集的数据,显卡产生的数据,这些数据用无符号数表示。有符号数和无符号数还与移位运算有关,当右移有符号数时,符号位不会移动,一直占位;而无符号数不会出现这种情况。char a=-1; 实际内存为0xff
4、float、double
注意常量的表示,3.2f表示float类型,3.2表示double类型。
5、void
只是语义意义上的关键字,表示空。
二:逻辑结构关键字
程序的运行是将代码放到内存空间中,根据pc指针的指向,决定运行哪一段代码,可以根据逻辑结构关键字,调整pc指针的指向来执行需要的代码,而调整的方式可以有(1)顺序执行、(2)条件选择、(3)循环执行
1、if else
if(条件表达式)
{}
else
{}
2、switch case default
swich case 条件中必须为整型数字,不能为其他的内容,如浮点数,必须加上break,不然会依次往下执行。
swich(){
case 1:
break;
case 2:
break;
default:
break;
}
3、do while for
for循环用于次数,while,do...while 用于条件,do...while至少执行一次。
4、continue break goto
循环中使用的控制字符,goto在相同的函数中使用,不能在不同的函数之间跳。
三、类型修饰符关键字
类型修饰符对数据类型关键字和自定义类型关键字进行修饰。类型的属性除了大小外,还有类型的存储位置,类型修饰符说明了类型的存储位置。
1、auto
auto int a;即为int a;平时使用的是省略形式。auto表示变量分配在普通内存可读可写空间的区域。{auto char a;},在大括号中定义的则表示在栈空间中分配的区域。
2、register
在一些经常需要访问到的变量,定义register 可以加快变量的访问,register int a;编译器在编译时,尽量会安排在cpu的寄存器中去存放变量a,但是如果寄存器空间不足时,还是会将变量a存放在存储器中。register这个关键字中看,不中用,起到和人交互时,表明变量需要快速的访问。寄存器没有像内存一样的地址,只由符号表示寄存器,因此不能用取地址符取其地址。
3、static有三种应用场景
1、修饰函数的内部变量,将函数内部变量的存储区域变为全局变量存储区。同一函数调用可以获取上一次的值
2、修饰全局变量,限制作用域
3、修饰函数,限制作用域
4、 volatile
volatile:告知编译器,编译时不做优化编译。某一变量值的改变是由外部改变的,而不是程序内部改变的,优化会导致不去不对值的操作而出问题。例如:int a = 100;while(a==100);操作;如果程序内部不改变a,此时会优化编译不执行while比较,一直执行操作,但是a的改变可能来自外部,这样会优化编译会导致出错。
三、自定义类型关键字
c语言编译器默认的内存分配形式不符合实际资源的形式,自定义类型为基本元素的集合
1、struct
结构体是对变量的打包,内存空间并没有申请,只是自己定义了个数据类型。结构体类型对里面元素的顺序是有要求的,结构体有字节对齐问题,按照4字节对齐,不同的顺序可能导致结构体的存储空间不一致。
2、enum
枚举类型,人与人交流的语义限制符
1、enum {MON,TUE,WED}实现的效果和
#define MON 0
#define TUE 1
#define WED 2
一样,用enum可以表示这些元素是一个组合的概念而不是一个个单独的元素。
2、enum abc{MON,TUE,WED}
enum abc t;sizeof(t)为4个字节的大小,变量表示可以取集合中的某一个值,但是t=100依然能够赋值进去,enum只是和人交流的语义限制符,没有表示强制的概念。
应用场景:就是常量属于一个类型的,组合起来可以更好地表示是一个组合的概念。
3、union
共用体表示其里面的元素共用起始地址的一段内存。用得不是很多,多用于技巧性的代码。
4、typedef
typedef : 起别名,对于变量名,见名知意。一般看到XXX_t的就为一个数据类型用typedef起的外号。不关注占用内存的大小,而是关注实际的物理意义。
五、杂项
1、sizeof: 一般写法sizeof(a),查看变量a或者数据类型占用的字节空间大小,一般认为是函数,其实是不对的,函数是在运行过程中调用,而关键字是在编译的过程被识别。而sizeof 在编译的过程被处理,而没有在函数的运行过程被处理,因此是一个关键字。
2、return