C/C 为什么static变量只初始化一次

转自:http://yuanyuanba.com/forum.php?mod=viewthread&tid=768 

class F {
public:
	int Famliy(int a) {
		static int famliy = a;
		std::cout << "in Famliy famliy:" << famliy << std::endl;
		return famliy;
	}
};
int main() {
	F f;

	std::cout << f.Famliy(2) << std::endl;

	std::cout << f.Famliy(3) << std::endl;

	std::cout << f.Famliy(4) << std::endl;

	std::cout << f.Famliy(5) << std::endl;

	cin.get();
}

输出:
in Famliy famliy:2
2
in Famliy famliy:2
2
in Famliy famliy:2
2
in Famliy famliy:2
2
 

 对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。

    存放在静态区的变量的生命周期一般比较长,一般与整个源程序“同生死、共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会立刻被销毁。

    分析以下程序代码:

#include<stdio.h>

void fun(int i)
{
              static int value=i++;
              printf("%d\n",value);
} 

int main( )
{
             fun(0);
             fun(1);
             fun(2);
             return 0;
}

    程序输出为

0

0

0

    程序每次输出都为0,是因为 value 是静态类型(static),只会定义一次。也就是说,不管调用fun( )这个函数多少次,

static int value = i++ 这个定义语句只会在第一次调用的时候执行,由于第一次执行的时候i = 0,所以 value 也就被初始化成 0 了,以后调用fun( )都不会再执行这条语句的。

分析以下一段代码:

#include<stdio.h>

void fun(int i)
{
             static int value=i++;
             value = i++;
             printf("%d\n",value);
} 

int main( )
{
             fun(0);
             fun(1);
             fun(2);
             return 0;
}

    程序输出为

1

1

2

    上述代码之所以输出为1,1,2,是因为当调用fun(0)时,由于value被声明为static,所以定义语句只执行一次,此时value=i++,value的值为0,i的值变为1,执行第二行语句value=i++后,此时value的值为i的初值为1,接着i的值变为2,所以第一次输出为1。当调用fun(1)时,因为value是静态变量,具有记忆功能,所以会跳过定义语句,只执行value=i++语句,所以value的值为1,而此时i的值变为2,所以第二次调用时输出为1。当调用fun(2)的时候,也会跳过定义语句,只执行value=i++语句,所以value的值为2,i的值变为3,所以第三次调用时输出为2。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值