I.typedef
格式:typedef (表达式或函数) (新名字)
作用:typedef其实就是type define,也就是给类型来一个简化的名字,以免后续使用它时输入麻烦,代码冗余。
如此图所示,typedef将int这一类型重定义为一个新名字“z”,后续在使用int时就可以直接用“z”来代替,更简便,后接函数的话也同理。
II.static
格式:static (表达式或函数)
作用:一共分为三种
- 修饰局部变量
- 修饰全局变量
- 修饰函数
static都是将修饰的转变为静态,具体效果我们逐一来分析:
修饰局部变量
我们先明确一个C语言中的储存概念。C语言储存时分栈区、堆区、静态区。局部变量一般是储存在栈区的,但如果局部变量所在的函数运行结束,栈区内的局部变量一般会清除。而static可以将局部变量的数据变成静态变量存到静态区,这时候静态变量不会随着所在的函数运行结束而结束,从而它的生命周期得到了延长。
这段代码的输出结果是2到11的十个数字,如果没有static,输出结果应该是十个2,为什么呢?因为当没有static的时候,每次循环,a都会经历“创建a”➡️“a+1”➡️“销毁a”的三个阶段。这是由于a是个局部变量,它的生命周期就是test函数的生命周期,每次循环都是个独立的过程,调用完test函数时,a的数据不会继承到下一次循环中,因为它在每一次循环中都“死”过一次;那如果有了static呢?那a的“生前记忆”就保存到了静态区,每次循环就都可以调用,相当于“带有上一代记忆的投胎转世”,如此情况下,每一次循环,a的值都会较“上一代”加1,就会出现2到11的十个数字。
修饰全局变量和函数
这个效果其实很简单,就是它们无法被跨文件调用了,extern不能够调用被static修饰的全局变量和函数了。具体原因则是static将它们的外部链接转化为了内部链接。
III.#define
格式(放在main函数外):
1. 当定义常量时:#define (常量名) (常量)
2.当定义宏时:#define (宏名) (宏体)
作用:定义常量时,就是给一个名字赋值,如#define num 100,则定义了num的值为100。但这里需注意一个问题:假设#define num 100,那如果在main函数里用num,num的值应该是100.但如果我在main函数里又定义了一个int num = 1000;呢?这时候是局部优先还是定义优先?
答案是会报错。具体原因如下:
而定义宏时,则意味着给一个名字写上它的内容,如#define Add(x,y) ((x)+(y))
它就是给Add函数写了内容,这个内容就是让x和y相加。