c语言编程

如题所述

注意关键字static静态存储变量,
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
举例说明
给读者一个简单直白的例子(区别静态局部变量和动态局部变量):
#include<stdio.h>
int fun(int n)
{
static int f=1;
f=f*n;
return f;
}
void main()
{
int i;
for(i=1;i<=5;i++)
printf("fun(%d)=%d\n",i,fun(i));
}
这里的运行结果是:
fun(1)=1
fun(2)=2
fun(3)=6
fun(4)=24
fun(5)=120
说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:
#include<stdio.h>
int fun(int n)
{
int f=1;
f=f*n;
returnf;
}
void main()
{
inti;
for(i=1;i<=5;i++)
printf("fun(%d)=%d\n",i,fun(i));
}
程序的运行结果是:
fun(1)=1
fun(2)=2
fun(3)=3
fun(4)=4
fun(5)=5
也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。
fun(a,b)=fun(2,3)
i=i+m+1=3
m=i+2+3=8
注意当第一次调用fun函数后,i与m的值就变成了3与8,当第二次调用函数fun时,
fun(a,b)=fun(2,3)
i=i+m+1=3+8+1=12
m=i+2+3=12+2+3=17
如果还调用一次fun(a,b)
i=i+m+1=12+17+1=30
m=i+2+3=30+2+3=35追问

啊,明白了,谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-05

static变量在两次函数调用之间一直存在

你可以运行一下下面这段代码,看看过程

#include<stdio.h>
void main()
{
     int a = 2, b = 3;
     printf("%d\n", fun(a, b));
     printf("%d\n", fun(b, a));
     
}
fun(int x, int y) {
    static int count = 0;
    count++;
    
    static int m = 0, i = 2;
    printf("第%d次调用函数,m的初始值为%d, i的初始值为%d\n", count, m, i);
    i += m + 1;
    m = i + x + y;
    return (m);
}

追问

谢谢

追答

不客气

第2个回答  2015-05-05
两个输出都为8追问

第二个是17啊,不知道怎么出来的

相似回答