c语言关于全局变量的问题!

int a=2;
int f(int n)
{
static int a=3;
int t=0;
if(n%2)
{
static int a=4;
t+=a++;
}
else
{static int a=5;
t+=a++;}
return t+a++;
}
main()
{
int s=a,i;
for(i=0;i<3;i++)
s+=f(i);
printf("%d\n",s);
}

帮忙详细解释下这个程序的过程。谢谢~~

结果
for(i=0;i<3;i++) s+=f(i);
s 初值s0 等于 全局性量 int a=2;
以后累加3次循环返回值 f(0),f(1),f(2).

f 函数里有 同名的3个 static int a;
他们的作用域:
int f(int n)
{
int t=0; // 每次进入t=0
static int a=3; //a1域
if(n%2)
{ static int a; // a2域
} else {
static int a; // a3域
}
//a1域
return t+a++;
-------------------------
static 量,当退出函数时,该存储单元保留,所以老值保留,不变0。
f(0) 调用,a1=3,通过a3域,t=5,a3 后加加变6,送返 t+a1=8, 送返同时a1++ 变 4;
f(1) 调用,a1=4,通过a2域,t=4,a2 后加加变5,送返 t+a1=8, 送返同时a1++ 变 5;
f(2) 调用,a1=5,通过a3域,t=6,a3 后加加变7,送返 t+a1=6+5=11, 送返同时a1++ 变 6;
-------------------------------------
s=s0+f(0)+f(1)+f(2) = 2+8+8+11 = 29
答案 29
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-03-19
函数中的静态变量只会被赋一次值,它的生存期一直到程序结束,但是每个静态变量又都有它的作用域,它只在声明变量的{}之内起作用。
在函数中全局变量a不会起作用,起作用的只有局部的a。
f(0):
因为n=0,a=3,进入else中得到t=5,同时使else语句中的a变成了6,返回t+a++=8,同时使得函数中的a=4;

f(1):
因为n=1,a=4,进入if中得到t=4,同时使if语句中的a变成了5,返回t+a++=8,同时使得函数中的a=5;

f(2):
因为n=2,a=5,进入else中得到t=6,同时使else语句中的a变成了7,返回t+a++=11,同时使得函数中的a=6;
所以结果=f(0)+f(1)+f(2)+s=8+8+11+2=29;
但是不建议这样写程序。

c语言全局变量可声明问题
c语言全局变量可声明问题:1、如果static和extern都没有,表示定义一个全局变量,其作用域限制在从定义开始到当前文件结尾;2、static的作用是将全局变量的作用域限制在从定义开始到当前文件结尾,且其他文件不可以用extern来让这个变量可见;3、extern的作用是声明一个已经在别处定义了的全局变量,不是重新...

C语言中,全局变量的初始化值是否自动为0?
全局变量包括静态全局变量和非静态全局变量,在没有初始化值时,其值自动为0,即定义在所有函数外,不归属于任何一个函数的,在没有初始化值时,自动为0;静态全局变量当定义在函数内的全局变量,有static标记时,默认初始化为0值;非静态全局变量没有默认初始值,C语言规定初始化值为随机值,但具体的...

C语言中的全局变量和局部变量有什么区别?
C#中没有全局变量的概念,可以定义一个common类,通过静态变量来存放所有需要的全局变量,调用的时候通过common来调用即可。调用的时候使用“命名空间.common.属性名”即可,例如 string m_name = common.Name ;common.farray [0, 2] = 0.5 ;...

C语言头文件定义全局变量问题
1、首先,我们可以在函数外面定义变量,就是全局变量。2、局部变量可以与全局变量同样命名。3、但是优先级是局部变量优先。4、但是局部变量的生命周期是整个结构内。5、全局变量是整个程序结束,才释放。6、我们也可以为变量加上修饰符。

C语言怎么定义全局变量
1、记住一条就够了:在函数之外定义的变量就是全局变量。用static修饰的变量可以是全局的,也可以是局部的,所以说“用static修饰的变量是全局变量”是错误的。用static修饰的变量的生命周期与全局变量一样,但可见性仍分全局和局部。2、全局变量在整个c文件中都能使用,而局部变量在其作用域内才能使用...

C语言头文件定义全局变量问题
一般来说,不会将全局变量的定义写在头文件中,因为如果多个c源文件都添加了头文件,那很容易引起重定义的问题,这时候一般编译器都会提示。正确的作法是在c源文件中定义一个全局变量。在头文件中加入全局变量的声明。比如 \/\/var.c 一个主要用于定义全局变量的c源文件int g_a;char g_x;\/\/var.h ...

C语言中局部变量和全局变量的不同点和相同点是什么?
在C语言中,局部变量与全局变量在作用域和存储位置上存在显著差异:1. 局部变量仅在定义它们的函数内部有效,其作用域限定在花括号{}之内。这意味着在函数外部,代码无法访问或声明局部变量。2. 全局变量在整个程序范围内都是可见的,从它们定义的位置开始,直到包含它们的源文件结束。这意味着全局变量...

C语言关键字extern详解
大家好!今天继续分享C语言关于全局变量的报错问题。问题一:extern修饰全局变量的正确用法和链接错误解决。extern用于声明全局变量,声明可以有无限次,但定义仅需一次。若仅声明未定义,将导致链接错误。定义extern修饰变量时需确保作用域匹配,即在头文件声明后,定义只能在函数外部,否则会报错。在函数外部...

C语言中全局变量有什么作用?
在C语言中,全局变量和函数声明及定义并列,也就是说,声明在最外层作用域的变量即为全局变 如在如下程序中 int i;int main(){int i_copy = i;i = 9;return 0;} int i就是一个全局变量,故在main函数中可以调用或修改i的值 所以,定义数组也和普通全局变量的方法相同,如 char str[10];...

c语言头文件包含、全局变量使用问题
全局变量在头文件中只是一个声明,所以不能赋初值,只有真正定义的时候,才可以赋值,所以一般头文件是extern int g; 这种写法的

相似回答