雄关漫道真如铁,而今迈步从头越
老铁们,我们上一篇文章把操作符给说了一下,今天就开始关键字的介绍吧!绝对齐全,包你满意哦!
1、数据类型关键字(12个)
2、控制语句关键字(12个)
3、存储类型关键字(4个)
4、其它关键字(4个)
关键字 | 解释 |
---|---|
char | 声明字符型变量或函数返回值类型 |
double | 声明双精度浮点型变量或函数返回值类型 |
float | 声明浮点型变量或函数返回值类型 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数返回值类型 |
short | 声明短整型变量或函数 |
signed | 声明有符号类型变量或函数 |
unsigned | 声明无符号类型变量或函数 |
struct | 声明结构体类型 |
union | 声明共用体类型 |
enum | 声明枚举类型 |
void | 声明函数无返回值或无参数,声明无类型指针 |
关键字 | 解释 |
---|---|
for | 一种循环语句 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
break | 跳出当前循环 |
continue | 结束当前循环,开始下一轮循环 |
if | 条件语句 |
else | 条件语句否定分支(与 if 连用) |
goto | 无条件跳转语句 |
switch | 用于开关语句 |
case | 开关语句分支 |
default | 开关语句中的“默认”分支 |
return | 子程序返回语句(可以带参数,也可不带参数) |
关键字 | 解释 |
---|---|
auto | 声明自动变量 |
static | 声明静态变量 |
extern | 声明变量或函数是在其它文件或本文件的其他位置定义 |
register | 声明寄存器变量 |
关键字 | 解释 |
---|---|
const | 声明只读变量 |
sizeof | 计算数据类型或变量长度(即所占字节数) |
typedef | 用以给数据类型取别名 |
volatile | 说明变量在程序执行中可被隐含地改变 |
由于很多关键字我们都经常使用,所以这里演示一些可能出现频率没那么大的关键字:
int main()
{
{
auto int a = 10;
}
printf("%d\n", a);
return 0;
}
auto
大部分情况下都是被省略掉的。因为我们创建的变量本身就是自动变量,有自己的生命周期和工作区域。
enum
枚举关键字,读者可以看一看我写的C语言初阶第一篇的篇尾,链接在这里:
C语言初阶第一篇
goto
语句允许把控制无条件转移到同一函数内的被标记的语句。我们现在基本上已经不使用这个语句了。在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
register
,声明寄存器变量,这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。如果要了解它的真正作用,我们首先还得理解一下电脑的内存的问题:
那么寄存器,就是最上面的那个了,寄存器是集成到CPU上的,并不是那么容易就能被访问,所以只能是建议程序使用,而不能强制。所以,这段代码现在应该就理解了:
int main()
{
register int num = 10;//建议将num放到寄存器中
printf("%d\n", num);
return 0;
}//寄存器的使用一般用在非常高频访问的变量身上
union
,声明共用体类型,这个关键字,就是声明一个变量,至于这个变量能干什么,我们需要学习了结构体的对齐才能有所了解,今天只简单的说一说:
//联合(共用体)
union Un
{
char c;
int i;
};//联合的大小至少是最大成员的大小
//当最大成员不是最大对齐数的整数倍时,就要对齐到整数倍
可能又有读者要问,那这个“对齐数”是啥?那么这里给出一个详细的解释链接:
结构体、结构体传参与其内存对齐、位段
volatile
,说明变量在程序执行中可被隐含地改变,网上的搜索结果如下:
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。有兴趣的小伙伴可以去看看:
C语言丨深入理解volatile关键字
我们平常基本使用不到这个关键字。
typedef
,这个关键字我们一般用来给结构体起别名:
typedef struct StuInfo
{
//每个学生的个人信息包括:姓名、学号、籍贯、年龄、数学、英语、物理成绩
char name[15];
char address[20];
char ID[15];
int age;
int score[3];
int sum;
int order;
}StuInfo;
当然,也可以用来更改数据类型的名字:
#include
typedef int ElemDataType;
int main()
{
ElemDataType a = 10;
printf("%d\n", a);
return 0;
}
static
,是用来修饰变量和函数的:
1、修饰局部变量,称为静态局部变量;
2、修饰全局变量,称为静态全局变量;
3、修饰函数,称为静态函数
我们先看两个代码的区别:
这个代码的运行结果是6 6 6 6 6 6 6 6 6 6
#include
void test()
{
int a = 5;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
而下面这个代码的结果是:6 7 8 9 10 11 12 13 14 15
#include
void test()
{
static int a = 5;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
没错,就是static,让局部变量变成了静态的局部变量,超出了局部的范围也不会销毁,会保留数据,下一次函数调用时依然存在。
static
修饰的局部变量是存储在静态区的,有兴趣的小伙伴可以自行了解一下静态区、堆区、栈区的区别。
但是,static也不是随便用的,一个全局变量本来是具有外部链接属性的,但一旦被static修饰,外部链接属性就变成了内部链接属性,则只能在自己的源文件里使用,而不能在其他的文件内部使用:
例如,我们在script.c的源文件里声明一个静态全局变量 globalval,然后在test.c里尝试使用:
就会报错。
那么这个其实跟上面的修饰全局变量是非常相像的,函数本来是具有外部链接属性的,全局的函数加上static之后,就失去了外部链接的属性。就会在使用中报错:
不加static是可以使用的:
extern
是用来声明外部符号的,给个例子就理解了:
这样的代码时报错的,那么怎么更改?很简单,使用extern来声明外部符号:
这样就可以了。
const
关键字,多见于函数的传参过程,因为传地址的效率更高一点,但是传地址会有一个缺点,就是又可能导致无意间修改了数据(因为给出地址是危险的行为)。所以const修饰之后,就会让使用安全很多。
不过const修饰的变量是一个常变量,详细的解释看笔者的这一篇文章:
从C语言发展历程到变量常量
点击这里,即可查看。
其他的关键字,基本大家都熟悉,就不多解释了。
define
应该是最容易被误认为是关键字的了,define并不是关键字,今天我们就顺便提一提define的使用吧!
define定义常量,我们见的都很多,其实没什么可说的,就给一个使用的案例代码吧:
#include
#define PI 3.14
int main()
{
int r = 10;
double area = 0;
area = (double)r * r * PI;
printf("%.2lf\n", area);
return 0;
}
关于定义宏,一般考试的实话可能会加以考察,我们只需要记住一句话:
define只替换、不计算。
#include
#define Cau(a,b) a + b
int main()
{
int a = 10;
int b = 20;
int ret = 0;
ret = 2 * Cau(a, b);
printf("%d\n", ret);
return 0;
}
这个代码的结果是多少呢?结果是 40,为什么?因为define只替换,不计算,我们换一下看看:
2 * 10 + 20 = 40,40就是结果。
那么今天的分享就到这里了,希望本文对你有所帮助,老铁们我们下次再见。