关于网友提出的“ 变量生命周期的问题”问题疑问,本网通过在网上对“ 变量生命周期的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 变量生命周期的问题
描述: #include
static int i;
int fun1(void)
{
static int j=0;
j++;
return j;
}
int fun2(void)
{
i=0;
i++;
return i;
}
int main(void)
{
int k=5;
int m;
for (k;k>0;k--)
{
m=fun1();printf("%d\t",m);
}
for (k=5;k>0;k--)
{
m=fun2();printf("%d\t",m);
}
return 0;
}
在Turboc 中运行的结果是:
1 2 3 4 5 1 1 1 1 1
在fun1()中,虽然i是static int,随着每一次函数调用,变量不销毁,但是每一次调用,都有static int i=0来重新赋值。为什么结果是1 2 3 4 5 ?
在fun2()中,莫名的1 1 1 1 1 ?
各位大虾!谁能深度剖析一下原因?
在此谢谢啦!
解决方案1: 对静态局部变量属于静态存储变量在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
解决方案2: 我觉得LZ没有搞明白什么事“初始化”,什么是“赋值”
“初始化”就是在函数定义的时候同时给变量一个值,而“赋值”则是在变量定义好之后,给其一个值
初始化举一个列子就是
static int x=0;
赋值举一个例子就是:
static int x;
x=0;
对于静态变量来说,只初始化一次。因此
int fun1(void)
{
static int j=0;
j++;
return j;
}
里面的j只进行一次初始化,而第二次调用的时候变量j的值是不变的,才会出现结果为1,2,3,4,5
而
int fun2(void)
{
i=0;
i++;
return i;
}
这里的i是全局的静态变量,你没有进行初始化,所以函数自动初始化为0,而你在函数调用的时候,每次都对它进行了重新的赋值。i=0; 因此你这是赋值,跟初始化没有关系,变量可以无数次赋值。
解决方案3:
fun2()的全局静态变量i=0是对i的重新赋值....不是"变量的定义"...fun1()中static int j=0;是变量的定义..所以fun2()中i每次都被重新赋值...
解决方案4: (1) fun1 () 中的 static int j=0; 属 static private 变数, 只会 initialize 一次,
之後就会记住值, 所以 j 会累加
(2) fun2 () 中的 i=0; 视为 private 变数, 而 #include static int i;
在 fun2 () 并无作用, 所以每次呼叫 fun2 () 时会清值 i = 0;
解决方案5: static 变量是在编译的时候就赋值了,你在运行的时候是不会执行这句的
解决方案6:
fun2函数中的局部变量i顶了全局变量i,所以每次自增的都是局部变量i,反悔的也是他,所以是1 1 1 1 1
解决方案7: static这个语句只初始化一次,
随然在其它函数中这个变量不可见,但它一直存在,并没有消毁。
解决方案8: 静态变量全局作用
解决方案9: 看看static关键字
里面讲了静态局部变量和静态全局变量的不同,并有代码说明。
解决方案10: 局部静态变量
解决方案11: static 变量在程序加载时初始化,在程序退出时才被销毁
解决方案12: 如果把fun1改成这样:
int fun1(void)
{
static int j=0;
j=0; // 加上这一行
j++;
return j;
}
每次他也都会返回1了
解决方案13: 规则如此,static生命贯穿程序执行全过程,但是{}外面不可见(不可见不代表不存在)
只初始化一次,以后再次访问就是上次的值
解决方案14: fun2里面的i=0就不同了,每次进入fun2的时候都要执行,所以每次都返回1
解决方案15: static 只初始化一次所以不会消失就出现1 2 3 4 5
普通的变量是临时的,调用玩就消失了,所以每次就是1
解决方案16: static变量只初始化一次,以后进入的时候就是上次遗留的值
解决方案17: static int i=0;
这个只初始化一次。第一次调用这个函数的时候把i置0,以后再进入这个函数就没有这个动作了。
以上介绍了“ 变量生命周期的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2760568.html