【问题标题】:Redeclaration of static variables in C... never happens?在 C 中重新声明静态变量...永远不会发生?
【发布时间】:2013-07-29 21:05:40
【问题描述】:

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

谢谢!

【问题讨论】:

标签: c variables static


【解决方案1】:

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

【讨论】:

  • 谢谢!我想我的错误在于不理解初始化和赋值之间的区别。阅读差异,现在它是有道理的。
【解决方案2】:

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

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

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

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

【讨论】:

  • “自动初始化为零,即使没有明确的初始化程序”使得static int i = 42; 中的i 似乎将被初始化为 0 而不是 42。
  • 但是在那个语句中有一个显式的初始化器。
  • 我知道 - 但你的说法暗示零初始化适用于任何事情。
  • 所以你只是不喜欢“偶数”,还是什么?如果您愿意,您有很多代表可以进行编辑。
  • 完成。我看到答案迅速更新,不想在编辑时踩到你的脚趾。
【解决方案3】:

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

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

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

每次都会打印1

【讨论】:

  • 声明中的初始化不是赋值。人们可能会被= 标记误导,但它是初始化语法的一部分,与赋值中的= 运算符不同。声明语句具有初始化。表达式语句具有赋值。所以编译器不会“寻找初始赋值”。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多