【问题标题】:static variable in c language [duplicate]c语言中的静态变量[重复]
【发布时间】:2021-12-28 17:45:58
【问题描述】:

静态变量是否只初始化一次?它是否忽略了它的初始化语句static int i = 1,所以它不会再次将它设置为1,所以它只是第一次读取它然后它忽略了吗?它是如何工作的。如果函数一次又一次地调用,谁能解释一下? 输出:123

#include<stdio.h>

void  increment();  
int main() 
{ 
    increment(); 
    increment(); 
    increment(); 
} 

void  increment() 
{ 
    static int i = 1 ; 
    printf("%d",i); 
    i=i+1; 
}

【问题讨论】:

  • 递归在哪里?
  • 我觉得有趣的是,您有一个最小的示例来表明这正是它的工作原理。你仍然问这个问题,就像你不相信一样。你还期待什么?

标签: c static initialization local


【解决方案1】:

根据 C 标准 *5.1.2 执行环境)

  1. ...所有具有静态存储持续时间的对象都应初始化(设置为 它们的初始值)在程序启动之前。

函数局部静态变量在函数调用之间保持其值。

所以程序会输出

123

【讨论】:

    【解决方案2】:

    声明为static 的变量在程序启动时初始化一次。当后续调用具有static 变量的函数时,将保留先前调用的值。

    在这种特殊情况下,对increment 的第一次调用打印“1”,第二次调用打印“2”,第三次调用打印“3”。

    【讨论】:

      【解决方案3】:

      作为正在发生的事情的心理模型,您的 increment 函数的工作方式就像它被重写为:

      static int foo_i = 1;
      void  increment() 
      { 
          printf("%d",foo_i); 
          foo_i=foo_i+1; 
      }
      

      自然不会存在名为foo_i 的变量,如果编译器进行这种重写,它将为foo_i 使用一个不会污染有效 c 标识符的命名空间的唯一名称。

      【讨论】:

        猜你喜欢
        • 2021-01-16
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多