0

我知道静态变量在程序的整个运行时保持它们的值,即使在函数调用之间也是如此。给定下面的代码,考虑到 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);
}
4

3 回答 3

3

每次调用函数时,您的代码都会将默认值为 0 的静态变量x设置为 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是唯一一个在每次执行包含它的函数时都不会重新分配变量的语句。

于 2021-09-25T08:59:36.230 回答
0

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);
}
于 2021-09-25T08:59:56.993 回答
0

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

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

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

将给出 6 的输出。

感谢所有回答的人。

于 2021-09-25T09:06:31.413 回答