C语言静态存储类型实例及收获

先上代码:

#include <stdio.h>

int fun(int i)    
{
	return i * i;
}
int main()
{
	int i = 0;      
	i = fun(i);
	for ( ; i < 3; i++)  
	{
		static int i = 1;    
		i += fun(i);         
		printf("%d,",i);    
	}
	printf("%d\n", i);     
	return 0;
}

如果按正常直觉来看,for循环体若以循环体内的i值是否小于3为判断条件的话,应只能循环1次,输出2,0才对。但其实for循环里面的i是循环体外部的i,外部的i独立自加,直到循环体外部的i≥3,循环体内的i独立输出,故第一次循环实际上是计算1+1*1=2,第二次循环先将静态变量i的值更新为2,再调用函数计算2+2*2=6,第三次计算6+6*6=42,此时循环体外的i==3,不满足循环条件,循环结束。输出循环体外的i值,为3。

所以程序最终结果为2,6,42,3。

所以我们有如下收获:

1.for循环中i的值,读取的是先前行中定义的变量值,并独立变化,与循环体中的变量没有关系。

2.若将static int i=1;改成int i=1,那么程序输出值将变为:2,2,2,3。这证明默认的auto存储类型无法更新为后面的变量值,因为此存储类型在调用结束后被内存释放掉了,故上一次的值不会被保存。但是static值的数据一直在内存中,只是进入休眠阶段,下一次用到这个数据时自动更新为前一次的数据(如上述for循环循环一次后,i==2,然后再次调用到static int i时,就会调用2)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值