C语言笔记-5-语法-32关键字及对应功能解析
前言
自学笔记,没有历史知识铺垫(省略百度部分),C语言32个关键字及对应功能解析
一、32个关键字列表
二、关键字解析
通用关键字
1.sizeof 计算数据类型的长度
int main(){
int a;
printf("a size is:%d\n",sizeof(a));
return 0;
}
3.void 占位符
语义意义,占位符,通常用在返回值/参数/声明占位数据
数据类型关键字
1.char 字符数据类型
char为软件操作的最小单位,大小为1Byte,包含8个bit(bit为硬件操作最小单位,一个bit可以表示高低电平)
- 通常用于软件与硬件数据交互的最小单位
- ASCII码表的每个字符同样为 8bit即1Byte
2.int/long/short 整数型数据类型
假设CPU一次周期满负荷作为最优处理大小
CPU位数 | 周期最大处理单位 | 数据类型 | 所占大小 | 最大值 |
---|---|---|---|---|
64位 | 64bit | int(非最优) | 4B | 2147483647 |
32位 | 32bit | int | 4B | 2147483647 |
16位 | 16bit | int | 2B | 65535 |
int所占位数与CPU有关,也与语言和编译器有关,CPU位数一般作为上限(非绝对)
long和short作为对int的缺陷所补充的数据类型
long可以存储更大的值,在64位处理器中可以达到一次周期满负荷处理
short可以存储更小的值,32位占2B,16位占1B
3.float/double 浮点型数据类型
float 4B
double 8B
4.unsigned/signed 无符号/有符号
标记数据的最高字节是符号位还是无符号位(数据)
有符号signed 127: 0111 1111
无符号unsigned 255: 1111 1111
自定义数据类型关键字
当编译器默认的内存分配不符合实际资源形式或阅读规范成本时使用
自定义 = 基础元素的集合
1.struct 结构体
struct所占用的内存大小,会因struct中的成员变量顺序而不同
原因:
编译器会根据struct中成员变量所占的大小,顺序相加(根据系统不同,相加大于2/4/8字节时,两个成员变量会各自开辟最大字节空间),成员变量的顺序会影响大小,struct的大小一定是4的倍数
struct特点
- 字节对齐(上述情况)
- 位域(顺序成员变量相加小于系统对应字节数时,占用空间会相加填充为2/4/8字节)(上述情况)
struct LedSignal{
unsigned int switchSignal;
unsigned int colorSignal;
unsigned int intervalSignal;
};
struct LedSignal ledSignal;
// typedef struct 联合使用,声明struct时,无需重复写struct该关键字
typedef struct LedSignal{
unsigned int switchSignal;
unsigned int colorSignal;
unsigned int intervalSignal;
};
LedSignal ledSignal;
2.union 共用体
与struct类似的方法创建复杂数据结构,区别:
共用体中所有变量的内存起始地址相同,意味着修改其中任意一个属性的值,可能会影响其他属性的值
内存段会被覆盖
union LedSignal{
unsigned char switchSignal;
unsigned int colorSignal;
unsigned float intervalSignal;
};
union LedSignal ledSignal;
3.enum 枚举
常量集合的概念,C中枚举的约束力很低,约定最好将该枚举可能的范围全部定义,如一周7天
嵌入式中可以将不同芯片的功能做不同的枚举区分和封装,便于阅读
enum WeekEnum
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
};
enum WeekEnum week;
int main()
{
//Tue:2
printf("Tue:%d\n", TUE);
week = MON;
//Mon:1
printf("Mon:%d\n", week);
week = SUN;
//Sun:7
printf("Sun:%d\n", week);
week = 800;
//800:800 enum没有限制,但约定需要限制这种情况
printf("800:%d\n", week);
return 0;
}
4.typedef 别名 _t结尾
不是新建的数据类型,而是对已有的数据类型起别名
用于描述物理功能的数据类型(与变量名概念一致,如果分等级,则别名比变量名级别高一级)如描述身高的别名int_heigh_t
规范
typedef创建的别名使用 _t 结尾,表示该数据类型位别名创建
typedef int int_heigh_t;
int main()
{
int_heigh_t aHeight = 180;
int_heigh_t bHeight = 191;
//a身高:180,b身高:191
printf("a身高:%d,b身高:%d",aHeight,bHeight);
return 0;
}
逻辑结构关键字
CPU 是顺序执行程序,逻辑结构可以通过代码调整CPU的执行顺序,如分支选择/循环
逻辑结构关键字大部分语言都是通用的,此处记录不会太详细
1. if/else 判断选择
if(true){
//do some
}else{
//do some
}
2.switch/case/default 多分支选择
C语言中 switch的条件只能传入整型
int product_type;
switch(product_type){
case 1:
//do some
break;
case 2:
//do some
break;
default:
//do some
}
3. do while / while /for 循环
for 次数条件时使用
while 判断条件时使用
do while 先执行再判断条件时使用
4.continue/break/goto/return 跳过/跳出/跳到/结束
continue和break 跳过/跳出循环时使用
goto 一般在函数内部使用,使用较少
return 有返回值函数或者立刻结束函数时使用
类型修饰符关键字
资源使用位置的限定
1.auto 动态修饰符
默认添加auto
int a;
auto int a;
注意:
1.如变量名在函数中,则使用范围为该函数;在函数外的文件中,则使用范围为该文件
2.如果在函数中,则内存位置在栈空间中
2.register 寄存器修饰符
限制变量定义在寄存器上的修饰符
register int a;
寄存器中运行速度比内存快N倍,如果频繁访问的变量,可以存放在寄存器中
注意:
1.寄存器越大,CPU越贵,当然相对而言,速度也越快
2.声明register后不一定都会在寄存器中使用,编译器只会尽量去安排,受寄存器容量的限制
3. &取址时,对register不起作用(编译报错)(寄存器和存储器内存地址不同)
3.static 静态修饰符
修饰位置:
- 局部变量 ->局部静态变量
作用:局部静态化,该变量将存储在静态数据区,生命周期与程序一致- 全局变量 ->全局静态变量
作用:防止重命名,仅本文件内可访问- 函数 ->静态函数
作用:防止重命名,仅本文件内可访问
作用:
- 隐藏与隔离
- 持久化变量内容
4.extern 外部声明修饰符
作用:
- 定义变量点之前可以使用该变量,全局变量
extern关键字,C语言extern关键字用法详解
5.const 常量修饰符
1.约定只读变量,约定不允许修改,实际上C语言可以通过指针进行修改
2.实际内存位置在读写区域,而不是只读区域,并不是真正常量
6.volatile 特征修饰符
作用:
- 阻止编译优化(阻止指令重排,单例中使用较多)
- 内存可见
场景:
外部硬件交互
总结
本章主要为C语言32个关键字及对应功能解析