|
|
发表于 2011-12-24 13:45:23
|
显示全部楼层
#include <stdio.h>
int a=2;(这是全局变量)
static int a=4;(这里的a 是静态的局部变量)
t+=a++;
C语言规定:当某函数内定义有与全局变量同名的局部变量时,则局部变量起作用,同名的全局变量被屏蔽。
关于静态变量(static)生存期:函数执行前变量就已经存在,这点有别于(auto)自动变量,并且函数被调用,执行期间修改了静态变量的值,则函数执行完后,该值仍然被保存,并将作为下次调用时该函数的初始值。
那么既然全局变量(最简单特征:在所有函数外定义的变量)的生存期是从程序执行开始到程序结束,那么他也有保存修改后值的能力,在这里注意作用于和生存期两个问题后,就能明白变化了。
具体流程:i = 0 , 1 , 2;
(1)
i = 0;
a = 2;(此程序中只有在main()函数中有效)
s = 2+ f(0);
进入函数,f(0):
a = 3;(此时发生全局变量被屏蔽 , 此值在f()函数中有效)
(0%2 == 0)所以执行else
a = 5;(此时发生全局变量被屏蔽 , 此值在else{}中有效)
t = 0 + 5;
++:a = 6; (此值在else{}中有效)
退出{}后
a = 3; (此值在f()函数中有效)
return t+a++ -> 5+3
a++:a = 4;(此值在f()函数中有效 , 保存,下次进入时使用)
s = 2+8 = 10;
(2)
i = 1;
s = 10+ f(1);
进入f()函数:
a = 4;(进入时此次用的是上次退出时保存的值,即使在有赋值语句int a = 3,这次不会再被覆盖)
f(1): (1%2 != 0)所以执行if
a = 4;(此时发生全局变量被屏蔽,此值在if{}中有效)
t = 0 + 4;
++:a = 5; (此值在if{}中有效,保存在下次进入if时使用)
退出if{}后a = 4;
return t+a++ -> 4+4
a++:a = 5;(此值在f()函数中有效 , 保存,下次进入时使用)
s = 10+8 = 18;
(3)
i = 2;
s = 18 + f(2);
进入f()函数:
a = 5;(进入时此次用的是上次退出时保存的值)
f(2):(2%2 == 0)执行else{}
a = 6;(上次保存在else{}退出时的值)
t = 0 + 6;
++:a = 7;(此值在else{}中有效)
退出else{}a = 5;
t = 6 + 5;
return 11;
++ : a = 6;(此值在f()函数中有效 , 保存,下次进入时使用)
s = 18 + 11;
终于搞定了,开始以为说起来很简单呢,结果这么难讲,还好完成了。多多调试会收获不少的。加油!
|
|