“static”在英文的解释中意为“静止的,停止的”,而当它放在计算机语言中它意为“静态”,那么当用这个关键字去修饰一些变量时会发生什么呢?这就是一个非常有意思的问题
1.修饰局部变量时
a.生命周期延长
我们都知道任何一个变量都是有自己的作用范围以及自己的生命周期,一旦出了他自己的领域那么它就会原地爆炸,不复存在(哈哈),而当它碰到了神之关键字“static”,那么它的结局就会不一样了!下面我们来看这两段代码
#include <stdio.h> int sum(int a) { int c = 0; int b = 2; c += 3; b += 2; return (a + b + c); } int main() { int i; int a = 3; for (i = 0; i < 3; i++) { printf("%d,", sum(a)); } return 0; }
这段代码运行的结果为10 10 10
而当我们用static去修饰调用函数里的变量b时,会有什么结果呢?
#include <stdio.h> int sum(int a) { int c = 0; static int b = 2; c += 3; b += 2; return (a + b + c); } int main() { int i; int a = 3; for (i = 0; i < 3; i++) { printf("%d,", sum(a)); } return 0; }
这段代码的结果为 10 12 14
(以上结果可以放在编译器中验证)那为何会有这两种差异呢?实际上就是static捣的鬼,当它修饰变量b时,感觉是使得b的生命周期变长了,即使修饰的局部变量出了作用域也不会被销毁,依然保持上一次的值,这也体现了static修饰局部变量时具有记忆性!其实在本质上来说static修饰局部变量时候,改变了储存位置(从栈区变到静态区)
2.修饰全局变量与函数
我们知道全局变量和函数都具有外部链接的属性(可以跨文件使用),那么当我用static去修饰时又会发生什么?在看代码
//代码1 //add.c int dal=2; //test.c extern int dal=2;//当我们要引用外部文件时要加上extern int main() { printf("%d",dal); return 0; } //代码2 //add.c static int dal=2; //test.c extern int dal=2; int main() { printf("%d",dal); return 0; } //代码1结果为2,代码2运行错误 //以下是关于修饰函数的验证 //代码3 //add.c int add(int x,int y) { return x+y; } //test.c extern int add(int x,int y)// int main() { int a=10; int b=20; int z=add(a,b); printf("%d",z); } //代码4 //add.c static int add(int x,int y) { return x+y; } //test.c extern int add(int x,int y) int main() { int a=10; int b=20; int z=add(a,b); printf("%d",z); } //代码3的结果是30,代码4错误
从以上代码可以看出当static修饰函数与全局变量时,两者的结局都是一致的,使得一个具有外部链接属性的一个东西变成了一个具有内部属性的东西,这就好像是把我原本失去的东西给夺回来,挽回自己那“该死的温柔”
好了,以上是本人晚上“梦到的内容",希望各位看官能留下你们英明的指导!感谢支持~