c语言 代码如下,为什么输出是29,求解释,越详细越好

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(1)};
printf("%d\n",s);
倒数第二句是s+=f(i)打错了

为了便于说明先整理一下代码,并对各行编号如下:
1)int a=2;
2)int f(int n)
3){
4) static int a=3;
5) int t=0;
6) if(n%2){
7) static int a=4;
8) t+=a++;
9) }
10) else{
10) static int a=5;
11) t+=a++;
12) }
13) return t+a++;
14)}

15)main(){
16) int s=a,i;
17) for(i=0;i<3;i++)
18) s+=f(i);
19) printf("%d\n",s);
20)}

解释执行结果之前先对全局变量和局部变量以及静态变量稍作解释:
如果全局变量和局部变量同名时,在局部变量所在作用域内,使用的是局部变量的值,局部变量以外使用的是对应的全剧变量的值。在{}内定义的局部变量,作用域只在{}内,出了{}后使用的是对应的全局或对应局部变量的值。
静态变量,只在定义时赋值一次,且函数执行完毕即使为局部变量,静态变量的值不释放,直到关闭整个工程退出为止。非静态变量,每次执行到对应的定义语句时,重新定义分配内存,所在所用域结束后释放对应的值;

程序开始执行,i = 0,调用函数f
此时进入第10)行的else中,因当前静态局部变量a=5;t为非静态的f函数内的变量初始值为0,故执行11)后t=0+5,a++后为6待下次执行到本else{}部分时使用;然后进入第13)t所在作用域未结束,故为上次值5,a此时为第4)行定义的静态变量,第一次使用初始值为3,执行后返回5+3,此处a的值++变为4,以便下次使用,返回到第18)行,s加返回值后为2+8=10

同理,i = 1,调用函数f
此时进入第7)行,当前if中有一个只在本{}起作用的a,初始值为4,t为非静态的f函数内的变量初始值为0,故执行第8)行后t= 0+4,a++后为5待下次执行到本if{}部分时使用;然后进入第13)t所在作用域未结束,故为上次值4,a此时为第4)行定义的静态变量,第二次使用i==0时计算后的值4,执行后返回4+4,此处a的值++变为5,以便下次使用,返回到第18)行,s加返回值后为10+8=18

同理,i=2,调用函数f
此时进入第10)行的else中,因当前静态局部变量a为上次执行后的值即i=0时进入后的值即6;t为非静态的f函数内的变量初始值为0,故执行11)后t=0+6,a++后为7待下次执行到本else{}部分时使用;然后进入第13)t所在作用域未结束,故为上次值6,a此时为第4)行定义的静态变量,第三次使用,值为i=1时使用后的值即为5,执行后返回6+5,此处a的值++变为6,以便下次使用,返回到第18)行,s加返回值后为18+11=29

循环结束,最后输出的值为29

这样解释够清楚了吧,问题的关键在于搞清楚变量的作用域(尤其是全局变量和局部变量同名时),还有搞清楚静态变量和非静态变量的生存期,就可以缕出头绪了!
希望对你有帮助!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-07
int a=2;
int f(int n); // n为参数,三次调用函数n分别等于0,1 ,2
{
static int a=3;
int t=0;
if(n%2) //当n除以2余数不等于0时,也就是当n=1时执行
{static int a=4;t+=a++; //执行完这句之后t=t+a=0+4=4,a=5 }
else //当n=0和2时执行
{
static int a=5;
t+=a++; //相当于t=t+a++;先执行t=t+a,a再自增,即第一次调用函数,执行完这句后t=0+5,a=5+1=6;当n=2时执行完这句之后,t=0+6=6,a=7
}
return t+a++; //先返回t+a后,a再自增1,三次调用返回的数分别为 5+3=8&&a=4,4+4=8&&a=5,6+5=11&&a=6
}

main()
{
int s=a,i; //s=2
for(i=0;i<3;i++)
s+=f(i); //s=s+f(i),调用函数f(i),i作为参数传递,三次调用 i 分别等于 0,1,2;s分别等于2+8=10,10+8=18,18+11=29
printf("%d\n",s);
}

哪里不懂可以继续问本回答被提问者采纳
第2个回答  2013-01-07
i=0,s =f(0),s =5 3,=2 5 3=10
i=1,s =f(1),s =4 4,=18
i=2,s =f(2),s =6 5=29
另外f(int n);那个分号也多号写了吧!
第3个回答  2013-01-07
你的逻辑很让人费解啊,你重定义a干嘛,这个应该会报错吧 ,你已经将a定义成全局变量,在函数里面你又定义了两次
相似回答