【问题标题】:How does a static variable differentiate between initialization and assignments静态变量如何区分初始化和赋值
【发布时间】:2021-11-18 06:53:29
【问题描述】:

我知道静态变量在程序的整个运行时保持它们的值,即使在函数调用之间也是如此。给定下面的代码,考虑到 x 被声明为静态并初始化为零,打印的 x 的值是多少。 using_static函数如何在每次调用函数时不给变量x赋值零?

int using_static()
{
   static int x;
   x = 0;
   x++;
   return (x);
}

int main()
{
   int i;
   i = 0;
   while (i < 5)
     {
       using_static();
       i++;
     }
   printf("%i", using_static());
   return (0);
}

【问题讨论】:

  • 您是否尝试在打开警告的情况下进行编译?你告诉printf() 打印一个函数指针,就像它是一个int;这不会很好地工作。
  • (如果你的代码有那么远;它首先有一个无限循环)。
  • @Shawn -- 所以你的意思是,如果你是一个名为i 的变量,故事永远不会改变? :)
  • 现在您可以运行那段代码并观察输出。并回答您自己的问题。
  • 为什么要使用while 循环?这是一个完美的例子,它应该是一个for 循环。此外,return 语句不需要大括号。不要添加不必要的大括号,它们会损害对语言的理解。不要教自己不良的编码习惯。

标签: c initialization static-variables function-definition storage-duration


【解决方案1】:

您的代码将静态变量 x 设置为默认值 0 到 0 每次调用函数时都会递增它,因此它的值不会超过 1。静态变量总是用一个值初始化(隐式在你的情况下为 0)。正确的代码是

int using_static() {
    static int x = 0; // The value of x won't be reassigned to 0 on every call since it has static storage.
    // Setting x = 0 here, after it's declaration would reassign it on every call and never allow it to go above 1.
    x++; // Value becomes 1 on first call, 2 on second call and so on
    return x;
}

变量被声明为static 的语句是唯一一个不会在每次执行包含它的函数时重新分配变量的语句。

【讨论】:

    【解决方案2】:

    知道了。静态变量自动初始化为零。如果需要,它们只能在声明期间初始化。

    所以虽然上面的代码会输出 1,但将 using_static() 更改为

    int using_static()
    {
       static int x = 0;
       x++;
       return (x);
    }
    

    将给出 6 的输出。

    感谢所有回答的人。

    【讨论】:

      【解决方案3】:

      using_static函数如何不给变量x赋值零 在每次调用函数期间?

      你错了。每次调用函数时,由于赋值语句,变量 x 被显式赋值为 0

      int using_static()
      {
         static int x;
         x = 0;
         ^^^^^^
         x++;
         return (x);
      }
      

      所以函数的返回值总是等于1。

      您的意思似乎是初始化变量而不是赋值。

      如果您将删除该声明

      int using_static()
      {
         static int x;
         x++;
         return (x);
      }
      

      然后函数会依次输出

      1 2 3 4 and so on
      

      最初,变量x 初始化为零。初始化发生在程序启动之前,并且只发生一次。

      来自 C 标准(5.1.2 执行环境)

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

      和(6.7.9 初始化)

      10 如果具有自动存储时长的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:

      ——如果它有算术类型,它被初始化为(正数或 无符号)零;

      ....

      你可以想象这样的功能

      int using_static()
      {
         goto L1;
         static int x = 0;
      
         L1: x = 0;
         x++;
         return (x);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2010-12-22
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多