代码之家  ›  专栏  ›  技术社区  ›  arya

忽略对静态变量的赋值

  •  1
  • arya  · 技术社区  · 9 年前

    我有以下代码:

    #include <stdio.h>
    
    int f1()
    {
        static int s=10;
        printf("s=%d\n",s++);
    }
    int main()
    {
        f1();
        f1();
        return 0;
    }
    

    输出为:

    s=10
    s=11
    

    为什么要排队 static int s=10 第二次忽略,当 f1 被调用?

    5 回复  |  直到 9 年前
        1
  •  8
  •   too honest for this site    9 年前

    这不是任务,而是 初始值设定项 地方的 static 像全局变量一样,变量只在程序启动时初始化一次。他们保住了最后一个 分配 值,甚至在函数调用之间也是如此。因此,在您第一次调用后,它将保留值 11 。事实上,它们就像文件范围 静止的 变量,其名称仅在声明的块范围内已知(但可以通过指针传递)。

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

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

    注: 初始值设定项 必须是常量表达式。尝试 static int s = 10, t = s + 5; 并读取编译器错误消息。

        2
  •  7
  •   ShadowRanger    9 年前

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

        3
  •  4
  •   Grzegorz Szpetkowski    9 年前

    这个 static 变量只初始化一次,概念上甚至在应用程序启动之前。

    来自C11(N1570)§5.1.2/p1 执行环境 :

    应初始化所有具有静态存储持续时间的对象(设置为 它们的初始值)。

    以及§6.2.4/p3 对象的存储持续时间 :

    它的生命周期是程序的整个执行过程及其存储 值仅在程序启动之前初始化一次。

        4
  •  1
  •   dbush    9 年前

    正如其他人所说 static 函数作用域中的变量只初始化一次。因此,赋值不会发生在对函数的后续调用上。

    与其他局部变量不同 静止的 局部变量不是在堆栈上定义的,而是在数据段中定义的,可能与全局变量位于同一位置。全局变量也在应用程序启动时初始化(它们必须初始化,因为它们不存在于函数内部,因此不能是可执行代码),因此从概念上讲,您可以考虑 静止的 变量作为具有有限可见性的全局变量。

        5
  •  1
  •   piFra    9 年前

    来自C89标准 HTML version 第3.1.2.4节 对象的存储持续时间 它规定:

    用外部或内部链接声明的对象, 或者使用存储类说明符static具有静态存储持续时间。对于这样的对象,将保留存储,其存储值仅初始化一次 ,在程序启动之前。对象存在,并在整个程序的执行过程中保留其最后存储的值

    (重点是我的)

    所以它说,每次使用静态限定符时,该变量都会在多个函数调用中保留其值。 非静态的局部变量在每次调用托管它们的函数时都会初始化,因此它们不会在函数调用中保留其值。

    希望这有帮助!