我试图完全理解静态变量在C中是如何工作的。我理解使用static关键字使变量的生命周期等于程序的持续时间。以下示例有一件事让我困惑......
我的 static_test.c 文件:
#include <stdio.h>
void foo(){
static int counter = 0;
counter++;
printf("This function has been called %i times.\n",counter);
return;
}
int main(){
int i;
for(i=0;i<10;i++){
foo();
}
return 0;
}
当我第一次阅读这个例子时,我想知道为什么函数不会每次都打印出0,因为我们将0分配给静态变量。
这是因为一旦声明了静态变量,编译器会在下次调用foo()
函数时忽略同一变量的另一个声明吗?
谢谢!
答案 0 :(得分:1)
在调用函数之前,静态变量在程序启动时恰好初始化一次。它是局部变量的事实不会影响这个规则。
此外,如果没有显式初始化,静态存储类变量会自动初始化为零;你程序中的= 0
是多余的。
根据C11草案标准(ISO / IEC 9899:201x), 6.2.4对象的存储持续时间,第3段:
使用存储类说明符
static
声明标识符的对象具有静态存储持续时间。它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。
答案 1 :(得分:1)
尽管使用了=
,但这是初始化,而不是赋值。因此,当变量初始化时发生,而不是“声明”明显“执行”时发生。因为它是一个静态变量,所以它在程序启动时初始化一次,而不是每次运行时都会初始化。
答案 2 :(得分:0)
是的,编译器在声明静态变量后查找初始赋值,并且只在程序启动时执行一次。
只有在声明变量时才会发生这种情况。例如,
void foo(){
static int counter;
counter = 0;
counter++;
printf("This function has been called %i times.\n",counter);
return;
}
每次都会打印1
。
答案 3 :(得分:0)
静态表示变量存在于函数的生命周期之外。把它想象成一个稍微聪明的全局变量。