变量的生存期和作用域(例题理解)(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老师所有!)
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值