【问题标题】:Not understanding the function of static int in C不了解 C 中静态 int 的功能
【发布时间】:2019-09-01 09:37:21
【问题描述】:

我正在尝试理解这段代码,但我不知道为什么静态变量的数量有时会改变,有时不会。

#include <stdio.h>
int func1 (int x)
{
    extern int a;
    static int y=0;
    printf("%d\n%d\n",a,y);
    a=x+5; y=x+1;
    {int y=10; printf("%d\n",y);}
    return y;
}
int a;
int main()
{
    a=func1(1);
    printf("%d\n",a);
    {
        int a=1;
        printf("%d\n", a);
    }
    a=func1(a);
    printf("%d",a);
    return 0;
}

这是输出:

0

0

10

2

1

2

2

10

3

首先,当a = func(1) 运行时,y 被声明为0,然后更改为2 并打印2。但是当它运行a = func(a)a2 时,我预计y 将变为0static int y = 0y 不会改变。为什么没有发生?

【问题讨论】:

    标签: c function static int


    【解决方案1】:

    静态对象在概念上是在创建时进行初始化的。

    静态对象的生命周期从程序开始执行开始,一直持续到执行结束。

    所以,当程序开始执行时,y 被初始化为 0。之后,它的值只有在修改时才会改变,就像赋值语句一样。定义它的语句static int y = 0; 在初始化后不会修改它。

    【讨论】:

    • 这是否也适用于普通整数?当 a 已经初始化时 int a = 7 会改变它的值吗?
    • @MatinN.:当int a = 7;出现在函数内部时,它具有自动存储时长。具有存储持续时间的对象(不是可变长度数组)的生命周期在每次进入其关联块时开始,但只有在程序执行到达声明语句时才会进行初始化。 (对于可变长度数组,生命周期从到达其声明时开始。)
    【解决方案2】:

    在函数内部声明为static 的变量在程序的整个生命周期内都会保留其值,即使变量名超出范围也是如此。 static 变量的初始值设定项在程序启动时应用。

    所以当程序启动时,y 被初始化为 0。然后在第一次调用 func 时,它会将 y 设置为 2。即使在函数退出后,这个值也会保留。所以第二次调用func时,函数启动时y还是2。

    【讨论】:

      【解决方案3】:

      静态意味着你只有一个变量的共享值,你可以想象它被声明为一个全局变量,在多个函数调用之间保持它的值。

      您第一次使用 x = 1 调用 funct1,因此 y 返回为 2。 下次使用 x = 2 调用函数 func1 时,不会再次声明 y 的值,而是使用上次调用的最后一个值 (y=2),并使用 y = x + 1 将其更新为 3。

      TLDR; 变量的静态声明只读取一次(static int y = 0),不要再返回,下次使用它的最后一个值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多