在C中重新声明静态变量......永远不会发生?

时间:2013-07-29 21:05:40

标签: c variables static

我试图完全理解静态变量在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 个答案:

答案 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)

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