变量的生命周期和{ }的相关知识

生命周期如果和寄存器、内存什么的挂钩,就变得不那么好理解。、

其实生命周期的概念也很简单,无非就是变量从哪到哪有效。这里只说生民周期和大括号{ }的联系


浅显一点说,一个变量的生命周期就是从上一个 { 开始,到下一个 } 结束为止

[1]

看这么一个程序,就会对生命周期的概念更了解一点

[cpp]  view plain  copy
  1. int main()  
  2. {//1  
  3.     int a=5;  
  4.     {//2  
  5.         int b=0;  
  6.         b++;  
  7.     }//3  
  8.     b++;//error, use without initialized  
  9.     return 0;  
  10. }  

问题——我们已经定义了b,为什么在括号外使用b的时候,会报错呢?

原因是——b的生命周期就是从 {//2 开始, }//3结束,然后b被回收,也就是b不存在了。(但是在VS中内存中的值还在,等待下一次分配)


[2]

[cpp]  view plain  copy
  1. int main()  
  2. {//1  
  3.     int a=5;//old a=5  
  4.     {//2  
  5.         int a=0;//new a=0  
  6.         a++;//new a=1;  
  7.         a+=2;//new a=2  
  8.     }//3  
  9.     a++;//old a=6  
  10.     return 0;  
  11. }  
这段程序给人的第一感觉是重定义!实际上却能够正常运行!

就像函数一样,在 { //2 到 } //3 之间,第二个a是有效的,即使同名。

需要注意的是,在内层的大括号中,由于两个a重名,所以无法访问外层的a。具体值的变化已经在程序中标出。


[3]

[cpp]  view plain  copy
  1. int main()  
  2. {  
  3.     int a=5;//a=5  
  4.     {  
  5.         int b=0;  
  6.         a++;//a=6  
  7.         b+=2;//b=2  
  8.     }//b died  
  9.     a++;//a=7  
  10.     return 0;  
  11. }//a died  
生命周期没结束的变量可以正常操作。参见注释


[4]回顾一下曾经使用过的生命周期相关知识:

1.for循环中定义变量,会在for循环结束后被回收。

[cpp]  view plain  copy
  1. for(int i=0;i<n;i++);  

2.函数中传递形参,会生成一个拷贝,函数结束后被回收;同时在函数中创建的变量也会被回收。

[cpp]  view plain  copy
  1. int cmp(int a,int b)  
  2. {  
  3.       int c=a+b;//生命周期到下一个}为止  
  4.       return a>b;  
  5. }  

[5]知识补充

如果想要完整的理解生命周期的知识,可搜索以下关键词:

1.变量在内存中的存放--------》全局变量\局部变量\栈区\堆区\动态分配

2.如何告诉编译器这个变量已经存在?------》extern语句的使用

3.连接、外连接-------》编译过程

4.多个cpp以及带.h的编译-------》宏定义\#ifndef

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值