<>名花有主已

C语言中有一些预先定义的字符串,他们本身被赋予了自身的功能。并且我们在定义变量的时候,不能去抢他们的名字来用。他们就是今天的主角:关键字

首先我们简单的和这些关键字见见面(被高亮的关键字是今天要介绍的)

autobreakcasecharconstcontinuedefaultdo
doubleelseenumexternfloatwhilegotoif
staticlongregisterreturnshortsignedsizeofint
structswitchtypedefunionunsignedvoidvolatilefor
这其中有大家熟知的数据类型:int,char,float,double…

也有控制语句用到的:if,for,do…

还有一些就是今天主要介绍的关键字。

至于还有一些新增的关键字,以上表格未曾提到,大家如果想去了解,可自行查找。

<>个别术语介绍(可先跳过,后文如若遇到不懂,可回来了解)

自动变量:指的是局部作用域变量,具体来说即是在控制流进入变量作用域时系统自动为其分配存空间, 并在离开作用域时释放空间的一类变量

存储类:是C语言与C++语言的标准中,变量与函数的可访问性(即作用域范围)与生存期

寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

​ 计算机中的数据可以存储到:寄存器,高速缓存器,内存,硬盘,网盘

​ (以上存储从左到右按照,内存越来越大,造假越来越低,传输速度越来越慢排序)



<>auto

auto:声明自动变量,一般都省略

​ 默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识存储类

代码如下:
int a=0; //上下两个变量其实相同,只不过上面省略了auto auto int a=0;
<>register

register:声明寄存器变量

​ 这个关键字定义变量后,会请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻
址访问,以提高效率。(因为寄存器很小,如果定义了很多register变量,可能会超过CPU的寄存 器个数,超过容量,故变量不是一定会存入寄存器内)

<>signed和unsigned

signed:有符号的(一般定义常量默认为signed)-------可以存储正数和负数

unsigned:无符号的-----不能存储负数
signed int a=10; //一般默认为signed,故只要写成:int a=10; unsigned float=-75.3------>错误定义
float=-75.3------>正确定义 signed float=-75.3------->正确定义
<>typedef

typedef:类型重定义-------一般对于太过复杂的数据类型,可以重新定义一个简单的或有辨识度的使用

​ typedef <数据类型> <你取的类型名>
unsigned long int a=10; //数据类型过于复杂,可以使用typedef重新定义 typedef unsigned long int
u_l_int; u_l_int a=10; //与unsigned long int a=10等价
<>extern

extern:用在变量或者函数的声明前,用来说此变量/函数是在别处定义的,要在此处引用

​ 默认情况下全局变量只能在定义它的文件中使用(从定义该全局变量开始到所在文件的文件尾),
但如果在另一个文件中将这个变量声明为外部变量,那么这个变量的作用域将被扩展到另外一个文 件中。

代码如下:

先在源文件中创建项目名为:main.c
#inlcude <stdio.h> extern int a; extern int Add(int x,int y); int main() {
printf("%d\n",a); printf("%d\n",Add(3,2)); }
再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件
int a=10;//全局变量 int Add(int x,int y)// { return x+y;//函数定义 }
结果会输出10,5

拓展:

*
变量的声明有两种情况
​ 1. 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
​ 2. 另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。
例如:extern int a 其中变量 a 可以在别的文件中定义的。
​ extern int i; //声明,不是定义
​ int i; //声明,也是定义

*
定义分配存储空间,而声明不会

*
如何区分声明还是变量

* extern告诉编译器变量在其他地方定义了
* 如果声明有初始化式,就被当作定义,即使前面加了extern
* 函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明
* 没有extern关键字的都是变量的定义
<>static

static:声明静态变量

* 修饰局部变量 使其生命周期变长(本质上改变了变量的存储类型)
* 修饰全局变量 改变了全局变量的作用域,让静态的全局变量只能在自己的源文件内使用
全局变量在其他源文件内部可以被使用,是因为全局变量具有外部链接属性。但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量
* 修饰函数 改变了函数的链接属性,将函数的外部链接属性变成了内部链接属性,使得函数只能在自己所在的源文件内部使用
解释1,代码如下:
#include <stdio.h> void Add(int x) { static int a=2; a++; printf("%d ",x+a); }
int main() { int i=0; for(i=0;i<3;i++) { Add(1); } return 0; }
结果是4 5 6,大家知道int a=2是一个自动变量,在他作用域结束后,空间就会释放掉,a的值不能保存。

而加上static改变了他的生命周期,使他在整个项目结束前的一直存在,所以a的值会不断迭代

解释2,3,代码如下:(引用extern的内容,大家可以自行对比)

先在源文件中创建项目名为:main.c
##inlcude <stdio.h> extern int a; extern int Add(int x,int y); int main() {
printf("%d\n",a); printf("%d\n",Add(3,2)); }
再在源文件中创建项目名为:test.c-------作为全局变量,函数定义的文件
static int a=10;//全局变量 static int Add(int x,int y) { return x+y;//函数定义 }
产生结果如下:

最后注意:#define和#include不是关键字,是预处理指令

以上介绍了一些关键字,但是并没有完全介绍清楚,还有疑问的大家可以自己查询。至于剩下的一些关键字,我将会在以后章节为大家详细介绍。

希望大家稀饭啦\(^ _ ^)/

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信