C语言初阶第五篇:讲一讲关键字,注意,define不是关键字哦 史上最全C语言关键字介绍(32个关键字全解析)

雄关漫道真如铁,而今迈步从头越
老铁们,我们上一篇文章把操作符给说了一下,今天就开始关键字的介绍吧!绝对齐全,包你满意哦!


关键字,是C语言本身提供给我们的,是我们不能创建的,常见的关键字有32个,我们来看一看:

一、初步认识32个关键字

1、数据类型关键字(12个)
2、控制语句关键字(12个)
3、存储类型关键字(4个)
4、其它关键字(4个)

1、数据类型关键字

关键字解释
char声明字符型变量或函数返回值类型
double声明双精度浮点型变量或函数返回值类型
float声明浮点型变量或函数返回值类型
int声明整型变量或函数
long声明长整型变量或函数返回值类型
short声明短整型变量或函数
signed声明有符号类型变量或函数
unsigned声明无符号类型变量或函数
struct声明结构体类型
union声明共用体类型
enum声明枚举类型
void声明函数无返回值或无参数,声明无类型指针

2、程序语句关键字

关键字解释
for一种循环语句
do循环语句的循环体
while循环语句的循环条件
break跳出当前循环
continue结束当前循环,开始下一轮循环
if条件语句
else条件语句否定分支(与 if 连用)
goto无条件跳转语句
switch用于开关语句
case开关语句分支
default开关语句中的“默认”分支
return子程序返回语句(可以带参数,也可不带参数)

3、存储类型关键字

关键字解释
auto声明自动变量
static声明静态变量
extern声明变量或函数是在其它文件或本文件的其他位置定义
register声明寄存器变量

4、其他关键字

关键字解释
const声明只读变量
sizeof计算数据类型或变量长度(即所占字节数)
typedef用以给数据类型取别名
volatile说明变量在程序执行中可被隐含地改变

二、部分关键字的使用演示

由于很多关键字我们都经常使用,所以这里演示一些可能出现频率没那么大的关键字:

1、auto

int main()
{
	{
		auto int a = 10;
	}
	printf("%d\n", a);
	return 0;
}

auto大部分情况下都是被省略掉的。因为我们创建的变量本身就是自动变量,有自己的生命周期和工作区域。

2、enum

enum枚举关键字,读者可以看一看我写的C语言初阶第一篇的篇尾,链接在这里:
C语言初阶第一篇

3、goto

goto语句允许把控制无条件转移到同一函数内的被标记的语句。我们现在基本上已经不使用这个语句了。在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

4、register

register,声明寄存器变量,这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。如果要了解它的真正作用,我们首先还得理解一下电脑的内存的问题:
在这里插入图片描述那么寄存器,就是最上面的那个了,寄存器是集成到CPU上的,并不是那么容易就能被访问,所以只能是建议程序使用,而不能强制。所以,这段代码现在应该就理解了:

int main()
{
	register int num = 10;//建议将num放到寄存器中
	printf("%d\n", num);
	return 0;
}//寄存器的使用一般用在非常高频访问的变量身上

5、union

union,声明共用体类型,这个关键字,就是声明一个变量,至于这个变量能干什么,我们需要学习了结构体的对齐才能有所了解,今天只简单的说一说:

//联合(共用体)
union Un
{
	char c;
	int i;
};//联合的大小至少是最大成员的大小
//当最大成员不是最大对齐数的整数倍时,就要对齐到整数倍

可能又有读者要问,那这个“对齐数”是啥?那么这里给出一个详细的解释链接:
结构体、结构体传参与其内存对齐、位段

6、volatile

volatile,说明变量在程序执行中可被隐含地改变,网上的搜索结果如下:
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。有兴趣的小伙伴可以去看看:
C语言丨深入理解volatile关键字
我们平常基本使用不到这个关键字。

7、typedef

typedef,这个关键字我们一般用来给结构体起别名:

typedef struct StuInfo
{
	//每个学生的个人信息包括:姓名、学号、籍贯、年龄、数学、英语、物理成绩
	char name[15];
	char address[20];
	char ID[15];
	int age;
	int score[3];
	int sum;
	int order;
}StuInfo;

当然,也可以用来更改数据类型的名字:

#include<stdio.h>
typedef int ElemDataType;
int main()
{
	ElemDataType a = 10;	
	printf("%d\n", a);
	return 0;
}

8、static

static,是用来修饰变量和函数的:
1、修饰局部变量,称为静态局部变量;
2、修饰全局变量,称为静态全局变量;
3、修饰函数,称为静态函数
我们先看两个代码的区别:

8.1、修饰局部变量

这个代码的运行结果是6 6 6 6 6 6 6 6 6 6

#include<stdio.h>
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<stdio.h>
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修饰,外部链接属性就变成了内部链接属性,则只能在自己的源文件里使用,而不能在其他的文件内部使用:

8.2、修饰全局变量

例如,我们在script.c的源文件里声明一个静态全局变量 globalval,然后在test.c里尝试使用:
在这里插入图片描述
在这里插入图片描述
就会报错。

8.3、修饰函数

那么这个其实跟上面的修饰全局变量是非常相像的,函数本来是具有外部链接属性的,全局的函数加上static之后,就失去了外部链接的属性。就会在使用中报错:
在这里插入图片描述
在这里插入图片描述
不加static是可以使用的:
在这里插入图片描述

9、extern

extern是用来声明外部符号的,给个例子就理解了:
在这里插入图片描述
在这里插入图片描述
这样的代码时报错的,那么怎么更改?很简单,使用extern来声明外部符号:
在这里插入图片描述
这样就可以了。

10、const

const关键字,多见于函数的传参过程,因为传地址的效率更高一点,但是传地址会有一个缺点,就是又可能导致无意间修改了数据(因为给出地址是危险的行为)。所以const修饰之后,就会让使用安全很多。
不过const修饰的变量是一个常变量,详细的解释看笔者的这一篇文章:
从C语言发展历程到变量常量
在这里插入图片描述
点击这里,即可查看。

其他的关键字,基本大家都熟悉,就不多解释了。

三、define的使用,定义常量和宏

define应该是最容易被误认为是关键字的了,define并不是关键字,今天我们就顺便提一提define的使用吧!

define定义常量,我们见的都很多,其实没什么可说的,就给一个使用的案例代码吧:

#include<stdio.h>
#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<stdio.h>
#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就是结果。

那么今天的分享就到这里了,希望本文对你有所帮助,老铁们我们下次再见。

  • 40
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
非常好的问题!以下是一个简单的 C 代码,可以统计关键字的数量: ```c #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXWORD 100 #define NKEYS (sizeof keytab / sizeof(struct key)) struct key { char *word; int count; } keytab[] = { {"auto", 0}, {"break", 0}, {"case", 0}, {"char", 0}, {"const", 0}, {"continue", 0}, {"default", 0}, {"do", 0}, {"double", 0}, {"else", 0}, {"enum", 0}, {"extern", 0}, {"float", 0}, {"for", 0}, {"goto", 0}, {"if", 0}, {"int", 0}, {"long", 0}, {"register", 0}, {"return", 0}, {"short", 0}, {"signed", 0}, {"sizeof", 0}, {"static", 0}, {"struct", 0}, {"switch", 0}, {"typedef", 0}, {"union", 0}, {"unsigned", 0}, {"void", 0}, {"volatile", 0}, {"while", 0} }; int getword(char *, int); int binsearch(char *, struct key *, int); int main() { int n; char word[MAXWORD]; while (getword(word, MAXWORD) != EOF) { if (isalpha(word[0])) { if ((n = binsearch(word, keytab, NKEYS)) >= 0) { keytab[n].count++; } } } for (n = 0; n < NKEYS; n++) { if (keytab[n].count > 0) { printf("%4d %s\n", keytab[n].count, keytab[n].word); } } return 0; } int getword(char *word, int lim) { int c, getch(void); void ungetch(int); char *w = word; while (isspace(c = getch())) { ; } if (c != EOF) { *w++ = c; } if (!isalpha(c)) { *w = '\0'; return c; } for (; --lim > 0; w++) { if (!isalnum(*w = getch())) { ungetch(*w); break; } } *w = '\0'; return word[0]; } int binsearch(char *word, struct key tab[], int n) { int cond; int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (low + high) / 2; if ((cond = strcmp(word, tab[mid].word)) < 0) { high = mid - 1; } else if (cond > 0) { low = mid + 1; } else { return mid; } } return -1; } int bufp = 0; char buf[MAXWORD]; int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= MAXWORD) { printf("ungetch: too many characters\n"); } else { buf[bufp++] = c; } } ``` 这个程序使用了一个结构体数组 `keytab` 来存储关键字和它们出现的次数。`getword` 函数用来获取输入中的单词,并将其转换为小写形式。`binsearch` 函数用来在 `keytab` 数组中查找单词。最后,程序会输出每个关键字出现的次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值