我试图理解这段代码,但是我不知道为什么静态变量的量有时会更改,而有时却不会。
#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
不会没改变。为什么它不发生?
答案 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),并且不要再次返回该变量,请下次使用它的最后一个值。