變數的生命週期和{ }的相關知識
阿新 • • 發佈:2019-01-23
生命週期如果和暫存器、記憶體什麼的掛鉤,就變得不那麼好理解。、
其實生命週期的概念也很簡單,無非就是變數從哪到哪有效。這裡只說生民週期和大括號{ }的聯絡
淺顯一點說,一個變數的生命週期就是從上一個 { 開始,到下一個 } 結束為止
[1]
看這麼一個程式,就會對生命週期的概念更瞭解一點
int main()
{//1
int a=5;
{//2
int b=0;
b++;
}//3
b++;//error, use without initialized
return 0;
}
問題——我們已經定義了b,為什麼在括號外使用b的時候,會報錯呢?
原因是——b的生命週期就是從 {//2 開始, }//3結束,然後b被回收,也就是b不存在了。(但是在VS中記憶體中的值還在,等待下一次分配)
[2]
int main()
{//1
int a=5;//old a=5
{//2
int a=0;//new a=0
a++;//new a=1;
a+=2;//new a=2
}//3
a++;//old a=6
return 0;
}
這段程式給人的第一感覺是重定義!實際上卻能夠正常執行!
就像函式一樣,在 { //2 到 } //3 之間,第二個a是有效的,即使同名。
需要注意的是,在內層的大括號中,由於兩個a重名,所以無法訪問外層的a。具體值的變化已經在程式中標出。
[3]
生命週期沒結束的變數可以正常操作。參見注釋int main() { int a=5;//a=5 { int b=0; a++;//a=6 b+=2;//b=2 }//b died a++;//a=7 return 0; }//a died
[4]回顧一下曾經使用過的生命週期相關知識:
1.for迴圈中定義變數,會在for迴圈結束後被回收。
for(int i=0;i<n;i++);
2.函式中傳遞形參,會生成一個拷貝,函式結束後被回收;同時在函式中建立的變數也會被回收。
int cmp(int a,int b)
{
int c=a+b;//生命週期到下一個}為止
return a>b;
}
[5]知識補充
如果想要完整的理解生命週期的知識,可搜尋以下關鍵詞:
1.變數在記憶體中的存放--------》全域性變數\區域性變數\棧區\堆區\動態分配
2.如何告訴編譯器這個變數已經存在?------》extern語句的使用
3.連線、外連線-------》編譯過程
4.多個cpp以及帶.h的編譯-------》巨集定義\#ifndef