文章目录
一.C语言的32个关键字
根据他们的作用,分为数据类型关键字、控制语句关键字、存储类型
关键字和其他关键字四类。
数据类型关键字(12个)
- char :声明字符型变量或函数返回值类型
- short :声明短整型变量或函数
- int: 声明整型变量或函数
- long :声明长整型变量或函数返回值类型
- float:声明浮点型变量或函数返回值类型
- double :声明双精度浮点型变量或函数返回值类型
- signed:声明有符号类型变量或函数
- unsigned:声明无符号类型变量或函数
- void :声明函数无返回值或无参数,声明无类型指针
- enum :声明枚举类型
- struct:声明结构体类型
- union:声明共用体类型
控制语句关键字(12个)
- 条件语句(3)
if:条件语句
else :条件语句否定分支(与 if 连用)
goto:无条件跳转语句 - 循环语句(5)
for:一种循环语句
do :循环语句的循环体
while :循环语句的循环条件
break:跳出当前循环
continue:结束当前循环,开始下一轮循环 - 开关语句(3)
switch :用于开关语句
case:开关语句分支
default:开关语句中的"默认"分支 - 返回语句 (1)
return :子程序返回语句(可以带参数,也可不带参数)
存储类型关键字(4个)
- auto :声明自动变量
- extern:声明变量或函数是在其它文件或本文件的其他位置定义
- register:声明寄存器变量
- static :声明静态变量
其他关键字
- const :声明只读变量
- sizeof:计算数据类型或变量长度(即所占字节数)(没想到吧,我既是操作符,也是关键字)
- typedef:用以给数据类型取别名
- volatile:说明变量在程序执行中可被隐含地改变
今天的目标是static关键字,其他关键字在后边会讲到
二.static关键字
这是今天要讲的重点,但得先介绍下
变量在内存中的存储
不同变量存储在不同的空间。
在栈区的变量的特点是进入作用域创建,出了作用域就销毁;而静态区的变量创建后直到程序结束后才释放。
变量的属性
变量有两种属性,包括外部链接属性和内部链接属性。
外部链接属性:变量可以在不同源文件中使用,但是得用extern声明。内部链接属性:变量只能在本源文件中使用。具有外部链接属性的变量也具有内部链接属性。一般全局变量具有外部链接属性,局部变量具有内部链接属性。
好了,介绍完毕,开始今天的正文。
static(静态的)
修饰局部变量
为什么两张图会出现不同的结果?
原因是:普通的局部变量放在栈区,它进入作用域创建,出了作用域就销毁。所以前张图每次调用函数时,j变量创建,调用结束后变量销毁,j的值每次都被初始化;而后张图的局部变量被static修饰,被放在静态区,直到程序结束后才释放,所以变量j只被初始化一次。
本质
static的修饰改变了局部变量的存储位置,因为存储位置的不同,导致执行效果不同。被static修饰不影响原来作用域的范围,但变量的生命周期变长:直到程序结束才销毁。
修饰全局变量
我们都知道全局变量具有外部链接属性,在不同的源文件使用它必须使用extern声明,表示这个变量在其他源文件中已定义。
但如果我们在声明变量的地方使用static会产生什么反应?
这个变量在static的修饰下就不能在其他文件中使用,从外部链接属性变成内部链接属性。
本质
static使全局变量的外部链接属性变成内部链接属性,改变了全局变量的作用域,但不改变它的生命周期。
当你不想要其他源文件使用这个源文件中的全局变量,你可以使用static修饰它。
修饰函数(类似于全局变量)
其实函数本身具有外部链接属性,在其他源文件使用也得使用extern声明。
那在定义函数的位置使用static修饰会有什么效果?
被static修饰的函数不能再其他源文件中使用,从外部链接属性变成内部链接属性。
本质
static改变了函数的外部链接属性,使它不能在其他源文件中使用。
今天的关键字就介绍到这,如果还有什么不懂的地方可以告诉我,我会尽己所能的帮助你。但如果我有什么地方讲的不对,请多多指正。感谢!