目录
在介绍正题之前,先说明一下变量的作用域与生命周期。
简单的说,局部变量的作用域是变量所在的局部范围——大括号内部
全局变量的作用域是整个工程
局部变量的生命周期是进入作用域到出作用域
全局变量的生命周期是整个程序的生命周期
一、修饰局部变量
static关键字可以改变变量的生命周期,而不会影响变量的作用域,具体情况可通过代码了解清楚:
#include<stdio.h>
void getSum()
{
int i = 0;
int sum = 0;
i++;
sum = sum + i;
printf("%d ", sum);
}
int main()
{
for (int i = 0; i < 3; i++)
{
getSum();
}
return 0;
}
此代码运行后的结果为:1 1 1;显然,每次离开i的作用域后,i就会被销毁,而每次进入i的作用域后,i又会被重新创建,这回答了为什么三次打印出的值都为1。
我们再来看看用static关键字修饰局部变量后的效果,代码如下:
#include<stdio.h>
void getSum()
{
static int i = 0;
int sum = 0;
i++;
sum = sum + i;
printf("%d ", sum);
}
int main()
{
for (int i = 0; i < 3; i++)
{
getSum();
}
}
运行后的结果为:1 2 3;也即在离开i的作用域后,i并没有被销毁,i的生命周期得到了延长,直到程序结束,生命周期才结束。
二、修饰全局变量
static关键字修饰全局变量,又会有什么样的效果呢?
我们新建另一个源文件,写入代码:
int age = 18;
再到初始的源文件中写入代码:
#include<stdio.h>
extern int age;
int main()
{
printf("%d\n", age);
return 0;
}
运行后我们可以在屏幕上看到数字18。
在int age前加上static修饰又会怎样呢?运行后编译器进行了报错。
这是由于默认一个全局变量是具有外部链接属性的,而如果使用static修饰全局变量,就会使得全局变量的这种属性变成内部链接属性,使得这个全局变量在其它源文件中无法被链接到,也无法使用。
三、修饰函数
修饰函数的情况与修饰全局变量类似,函数也是具有外部链接属性的,如果使用static修饰函数,也会使得函数的这种属性变成内部链接属性,使得这个函数在其它源文件中无法被链接到,也无法使用。
static int getSum()
{
int a = 1;
int b = 1;
int sum = 0;
sum = a + b;
return sum;
}
上面所写的代码自然也就无法在别的源文件中使用了。