不了解C中static int的功能

时间:2019-04-10 20:26:14

标签: c function static int

我试图理解这段代码,但是我不知道为什么静态变量的量有时会更改,而有时却不会。

#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)a的情况下运行2时,我希望y会通过0变成static int y = 0,但是y不会没改变。为什么它不发生?

3 个答案:

答案 0 :(得分:3)

从概念上讲,静态对象是在创建时初始化的。

静态对象的生存期从程序开始执行时开始,一直持续到执行结束为​​止。

因此,当程序开始执行时,y初始化为0。此后,其值仅在修改后才与赋值语句一样更改。初始化后,定义它的语句static int y = 0;不会对其进行修改。

答案 1 :(得分:1)

在函数内部声明为<nav class="navbar-top fixed-top"> <div class="row"> <div class="col-sm-4 text-left"> <a href="/">Home</a> <a class="mx-3" href="/catalog">Shop!</a> </div> <div class="col-sm-8 text-right"> <div class="dropdown"> <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" id="loginDropdown" aria-haspopup="true" aria-expanded="false">Login</button> <div class="dropdown-menu" aria-labelledby="loginDropdown"> <form class="px-4 py-3"> <div class="form-group"> <label for="loginDropdownFormEmail1">Email Address</label> <input type="email" class="form-control" id=loginDropdownFormEmail /> </div> <div class="form-group"> <label for="loginDropdownFormPassword1">Password</label> <input type="password" class="form-control" id="loginDropdownFormPassword1" /> </div> <div class="form-check"> <input type="checkbox" class="form-check-input" id="loginDropdownCheck" /> <label class="form-check-check-label" for="loginDropdownCheck">Remember Me</label> </div> <button type="submit" class="btn btn-primary">Login</button> </form> </div> </div> </div> </div> </nav> 的变量在程序的整个生命周期内都保留其值,即使变量名称超出范围也是如此。 static变量的初始化程序仅在程序启动时应用。

因此,在程序启动时,static初始化为0。然后在第一次调用y时,将func设置为2。即使函数退出,该值也会保留。因此,当第二次调用y时,函数启动时func仍为2。

答案 2 :(得分:0)

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

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

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