忽略对静态变量的赋值

ary*_*rya 1 c linux static-variables

我有以下代码:

#include <stdio.h>

int f1()
{
    static int s=10;
    printf("s=%d\n",s++);
}
int main()
{
    f1();
    f1();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

s=10
s=11
Run Code Online (Sandbox Code Playgroud)

为什么static int s=10第二次忽略该行,何时f1被调用?

too*_*ite 8

这不是任务,而是初始化程序.局部static变量仅在程序启动时初始化一次,如全局变量.即使在函数的调用之间,它们也保持最后的赋值.因此,在您第一次通话后,它会保留该值11.实际上,它们就像文件范围static变量一样,它们的名称仅在声明它们的块的范围内已知(但您可以通过指针传递它们).

缺点是它们只存在一次.如果从多个线程调用相同的函数,它们都共享同一个变量.

尝试第三个电话:你会得到12.

注意:初始化程序必须是常量表达式.尝试static int s = 10, t = s + 5;并阅读编译器错误消息.


Sha*_*ger 7

静态变量的初始化是一次性的(初始化时间保证在第一次调用之前发生,这可能发生在编译时或运行时;依赖于编译器).这是使用它们的主要原因.

  • 对,那是正确的.这就是"一次性"的意思; 初始化只执行一次(可能在您第一次调用该函数之前),而且从不再执行; 随后一次调用`f1`,肯定__won't__. (2认同)