请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

猿媛之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3626|回复: 0

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

[复制链接]

44

主题

48

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2016-1-17 22:39:22 | 显示全部楼层 |阅读模式
    对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。
    存放在静态区的变量的生命周期一般比较长,一般与整个源程序“同生死、共存亡”,所以它只需初始化一次。而auto变量,即自动变量,由于存放在栈区,一旦调用过程结束,就会立刻被销毁。
    分析以下程序代码:
  1. #include<stdio.h>

  2. void fun(int i)
  3. {
  4.               static int value=i++;
  5.               printf("%d\n",value);
  6. }

  7. int main( )
  8. {
  9.              fun(0);
  10.              fun(1);
  11.              fun(2);
  12.              return 0;
  13. }
复制代码
    程序输出为
0
0
0
    程序每次输出都为0,是因为 value 是静态类型(static),只会定义一次。也就是说,不管调用fun( )这个函数多少次,staticint value = i++ 这个定义语句只会在第一次调用的时候执行,由于第一次执行的时候i = 0,所以 value 也就被初始化成 0 了,以后调用fun( )都不会再执行这条语句的。
分析以下一段代码:
  1. #include<stdio.h>

  2. void fun(int i)
  3. {
  4.              static int value=i++;
  5.              value = i++;
  6.              printf("%d\n",value);
  7. }

  8. int main( )
  9. {
  10.              fun(0);
  11.              fun(1);
  12.              fun(2);
  13.              return 0;
  14. }
复制代码
    程序输出为
1
1
2
    上述代码之所以输出为1,1,2,是因为当调用fun(0)时,由于value被声明为static,所以定义语句只执行一次,此时value=i++value的值为0i的值变为1,执行第二行语句value=i++后,此时value的值为i的初值为1,接着i的值变为2,所以第一次输出为1。当调用fun(1)时,因为value是静态变量,具有记忆功能,所以会跳过定义语句,只执行value=i++语句,所以value的值为1,而此时i的值变为2,所以第二次调用时输出为1。当调用fun(2)的时候,也会跳过定义语句,只执行value=i++语句,所以value的值为2i的值变为3,所以第三次调用时输出为2

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|猿媛之家    

GMT+8, 2020-2-28 12:57 , Processed in 0.225457 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表