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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:39   2808   0

转自: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。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP