1 #include<stdio.h>
2 #include<stdlib.h>
3 static int a=2018;
4 static void func(void)
5 {
6 static int b;
7 printf ("a=%d,b=%d\n",a++,++b);
8 }
9 int main()
10 {
11 func();
12 func();
13 func();
14 return 0;
15 }
输出如下
a=2018,b=1
a=2019,b=2
a=2020,b=3
如果一个变量加了static的话,就会在全局数据区存储,如果不对他初始化的话,编译器就会对他自动进行赋值为0。这里值得注意的是static的作用域和生命周期,这里我又要说一下作用域和生命周期的概念。
生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。
作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。
static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。