2

我试图完全理解静态变量在 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()函数时忽略同一变量的另一个声明?

谢谢!

4

4 回答 4

1

静态变量在程序启动时被初始化一次,在你的函数被调用之前。它是局部变量这一事实不会影响此规则。

另外,静态存储类变量如果没有显式初始化,会自动初始化为零;在= 0你的程序中是多余的。

来自 C11 草案标准 (ISO/IEC 9899:201x),第6.2.4 节对象的存储持续时间,第 3 段:

一个带有存储类说明符的标识符被声明的对象static具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。

于 2013-07-29T21:06:51.320 回答
1

尽管使用了=,这是一个初始化,而不是一个赋值。因此,它发生在变量被初始化而不是“语句”显然被“执行”时。由于是静态变量,所以在程序启动时初始化一次,而不是每次函数运行时初始化。

于 2013-07-29T21:10:30.947 回答
0

静态意味着变量存在于函数的生命周期之外。把它想象成一个稍微聪明的全局变量。

于 2013-07-29T21:11:39.257 回答
0

是的,编译器在声明一个静态变量后寻找一个初始赋值,并且只在程序启动时执行一次。

这只发生在您声明变量时。例如,

void foo(){
    static int counter;
    counter = 0;
    counter++;
    printf("This function has been called %i times.\n",counter);
    return;
}

1每次都会打印。

于 2013-07-29T21:10:04.077 回答