1. 程式人生 > >變數的生命週期和{ }的相關知識

變數的生命週期和{ }的相關知識

生命週期如果和暫存器、記憶體什麼的掛鉤,就變得不那麼好理解。、

其實生命週期的概念也很簡單,無非就是變數從哪到哪有效。這裡只說生民週期和大括號{ }的聯絡

淺顯一點說,一個變數的生命週期就是從上一個 { 開始,到下一個 } 結束為止

[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