变量的生存期和作用域(例题理解)(c语言)

例题:

给出下面的程序,在不使用计算机的情况下,自行判断输出结果。

#include <stdio.h>
void func();
int n=1;
int main()
{
	static int a;
	int b=-10;
	printf("a:%d,b:%d,n:%d\n",a,b,n);
	b+=4;
	func();
	printf("a:%d,b:%d,n:%d\n",a,b,n);
	n+=10;
	func();
}
void func()
{
	
	static int a=2;
	int b=5;
	a+=2;
	n+=12;
	b+=5;
	printf("a:%d,b:%d,n:%d\n",a,b,n);
}

结果:

a:0,b:-10,n:1
a:4,b:10,n:13
a:0,b:-6,n:13
a:6,b:10,n:35

分析:

第一个输出:一开始a为静态存储没有初始化,默认为0;b局部变量定义为—10;n全局变量为1

第二个输出:是在func函数中,a静态存储定义初始化为2,在加上2所以为4;b在函数中定义为局部变量初始化为5,再加上5所以为10;n为全局变量1再加上12,为13

第三个输出:是在主函数中,变量重名时,采用局部变量就近原则,a此时依然没有变为0;b重新从-10开始,加上4为-6;n此时没有变化为13

第四个输出;在func函数中,a为静态存储变量,第二个输出是静态存储为4了已经,在加上2,a此时输出为6;b在函数中从5重新开始,再加上5,输出10;n为全局变量,第三次输出时,n为13,在主函数中n接下来又加上了10,所以此时变为了23,回到func函数中,n又加12,变为35,输出。

总结:

静态存储变量与全局变量的改变很容易搞乱,大家要好好理解。
另外附上个人导师的过程分析图就更好理解了,嘿嘿。。
(图片版权归chen老师所有!)
在这里插入图片描述

发布了17 篇原创文章 · 获赞 15 · 访问量 548

猜你喜欢

转载自blog.csdn.net/qq_46009744/article/details/104396732