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

来源:互联网 发布:github php开源项目 编辑:程序博客网 时间:2024/05/22 16:41

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

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


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

[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