【C语言跬步积累】——关键字(1)(typedef、static)

189 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言:

关键字是不能和变量名冲突的 

实例:

#include<stdio.h>
int main()
{
int float=0;
return 0;
}

该代码就是错误的,float是关键字,不能作为变量名来使用

常见关键字:

auto 、 break 、 case 、 char 、 const 、 continue 、 default 、 do 、 double 、 else 、 enum 、 extern 、 float 、 for 、 goto 、 if 、 int 、 long、 register 、 return 、 short 、 signed 、 sizeof 、 static 、 struct 、 switch 、 typedef 、 union 、 unsigned 、 void 、 volatile 、 while

暂时先介绍下面几个,后续会有补充,另外关键字不建议背下来,之后自己敲代码敲多了就记得了,现在了解一下就行

一.typedef

1.定义

typedef顾名思义是类型定义,可以理解为类型重命名

 2.使用

有些类型比较长,打字比较麻烦,就可以使用typedef将该类型重新取个名字,方便后续的使用

3.实例

#include<stdio.h>
int main()
{
typedef unsigned int u_int;//unsigned int是无符号的整型类型
u_int num1 = 66;
unsigned int num2 = 88;
return 0;
}

解释:

这里我们将比较长的unsignded int通过typedef重新命名为u_int,使得后续使用时更加方便,num1和num2的类型是相同的,u_int只是unsignded int的别名。【就比如有个人真名叫张三,但有人嫌这么叫不顺口,就给他取了个别名:小三,发现这样顺口多了,因此张三和小三是同一个人,只是不同的叫法而已】

二.static

 1.定义

在C语言中,static是用来修饰变量和函数的

2.作用

(一)修饰局部变量

实例(未使用static进行修饰):

#include<stdio.h>
void test()
{
	int a = 1;
	a++;
	printf("a=%d\n", a);
}
int main()
{
	int i = 0;
	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

这段代码大家应该比较熟悉,主要由while循环语句和构造的新函数test组成

输出结果:

image.png

解释:

首先先看main函数,新构造的函数先别管它,开始执行时i=0,因为i<5,所以进入while循环,进入循环时先遇到构造的函数test,然后test函数便会启动自身的功能:【定义一个局部变量a(进入作用域时生命周期开始,离开作用域时生命周期结束),并赋值为1,然后a++变成2,最后打印a=2,离开test函数。】刚刚这整个过程都是在test函数内进行的,离开后遇到i++,i变成1,又因为1<5,再一次进入while循环。进入循环时仍然先遇到test函数:【定义一个局部变量a并赋值为1,然后a++,变成2,再打印出来】,然后遇到i++,i变成2,2<5,继续进入循环,直到i=5时循环结束,因此会打印出5次a=2。

如果不能理解我通过代码运行的步骤来进行讲解(注意观察最左边黄色箭头的位置和左下角监视窗口i的值,箭头的位置表示正在编译中,还未执行):

调试过程:

 第一步:代码首先进入main函数,此时还未执行到int i=0,因此无法获取i的值

image.png

第二步

image.png 第三步:此时i因为小于5,进入while循环

image.png

第四步

image.png

第五步:经过test函数并不会影响i的值,只不过像是按下了test函数的启动按钮,使test函数生命周期开始,打印出a=2,然后离开test函数,生命周期结束

image.png

第六步

image.png

第七步:

image.png

第八步

image.png

第九步

image.png

第十步

image.png

第十一步

image.png

以上便是大概的流程,之后的重复动作就不放上去了,此处的用意在于理解为什么会打印5个a=2

上面写了这么多的目的便是和下面的static做一个对比,能够更加清晰的认识static

实例(使用static进行修饰):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void test()
{
	static int a = 1;//a是一个静态的局部变量
	a++;
	printf("a=%d\n", a);
}
int main()
{
	int i = 0;
	while (i < 5)
	{
		test();
		i++;
	}
	return 0;
}

输出结果:

image.png

解释:

有static修饰之后,第一次进入test函数时,a打印出2,和一开始那段代码一样,如果没有static,那么离开test时,a的值便会销毁,当你下一个循环再一次进入test函数时,a仍然先是赋值为1,然后a++,变为2,然后打印a=2。但如果加了static,那么离开test函数时a的值不会被销毁,即下一次进入test函数时a是等于2,然后a++,a变为3,再打印a=3。可以简单理解为不加static,结束之后a就会喝孟婆汤,下一次再进入test时,a便会忘了之前是多少;加上static便不会喝孟婆汤,下一次进入test函数时还知道自己之前是多少,不会重新来过

为了方便大家理解,可以结合下面的图(我会跳过其他部分内容,只展示test函数内部的运行结果

此时第一次进入test函数,a=1

调试过程:

image.png

image.png

image.png ⬇此时第二次进入test函数,a的值并不是1,而是继承了上一次的结果2

image.png

image.png

image.png

之后的结果就不展示了,感兴趣的可以自己动手操作一下

小结:

static修饰局部变量时,局部变量的生命周期变长。人话:可以继承,不会被消灭

(二).修饰全局变量

实例(为使用static进行修饰):

image.png

image.png

输出结果:

image.png

全局变量只要在源文件内部,进行外部声明(extern-声明外部符号),便可以在其他文件中使用,但两个源文件的后缀名要相同

实例(使用static进行修饰):

image.png

image.png

输出结果:

image.png

解释:

static修饰全局变量,改变了变量的作用域,让静态的全局变量只能在自己所在源文件内部使用

(三).修饰函数(和修饰全局变量差不多)

实例:

image.png

image.png

图片有点问题第三行应该是:extern int add(int,int);//声明外部函数

 输出结果:

image.png

对于该函数不了解的可以去我主页查找之前写的加法代码讲解 [:](juejin.cn/post/713768…)

小结:

  • static修饰函数也是改变了函数的作用域(该说法不准确,但易于理解)

  • 准确的说法应该是static修饰函数改变了函数的链接属性

  • 普通的函数具有外部链接属性

  • 被static修饰的函数的外部链接属性变成了内部链接属性