变量的作用域与生命周期
-
局部变量
-
普通
仅在作用域有效,每次调用包含该局部变量的函数时,该变量会被重新初始化。
例如:
void func() { int a = 1; ++a; printf("a = %d\n",a); } int main() { func(); func(); }
两次调用
func()
后a
的值都为2,生命周期随函数的结束而结束。 -
静态
staic
仅在作用域有效,每次调用包含该局部变量的函数时,该变量不会被重新初始化,而是接着上一次的值运行下去。
例如:
void func() { static int a = 1; ++a; printf("a = %d\n",a); } int main() { func(); func(); }
第一次调用
func()
后a
的值为2,第二次调用后为3,生命周期随程序的结束而结束。
注:局部变量不赋初值其值为随机值
-
-
全局变量
-
普通
作用域跨文件,不会被重新初始化,在上次值得基础上改变值。
跨文件使用时需用
extern
声明。例如:
a.c
int a = 1;
main.c
extern int a; int main() { a++; printf("a = %d\n",a); return 0; }
a 的最终值为2;
-
静态
static
作用域限定在其所在的文件内。
例如:
a.c
static int a = 1;
main.c
extern int a; int main() { a++; printf("a = %d\n",a); return 0; } //err
报错:a 未定义,发生链接错误。因为静态全局变量无法跨文件使用。
注:局部变量不赋初值其值为 0
-