變量的生存期和作用域是個很基礎但又很重要的問題,所以我打算寫幾百字重溫一下。
變量的生存期是指變量在什么時間段存在。
變量的作用域是指變量在哪些代碼塊中能夠被訪問。
一般來說變量生存期包含作用域。即在變量起作用的代碼段,這時變量已經分配了存儲空間。
也就是說,變量可能已經分配存儲空間,但它不能被訪問。
在程序加載到內存中時,有些變量就已經分配存儲空間,並且這個存儲空間直到整個程序執行完畢,從內存中退出時才會被釋放。
這些變量的生存周期就為整個程序的生存周期。如 全局變量和靜態局部變量。它們的差別是全部變量的作用域一般為定義處到它所在文件結束。
要在全局變量定義位置之前或其他源文件中引用該全局變量,需要用extern來擴展該全局變量的作用域。
程序中有的變量在程序加載到內存中時並不分配存儲空間,而是到定義它的函數被調用執行時才會臨時分配存儲空間,並且一旦該函數執行完畢返回到被調用處,這些變量的存儲空間會被回收。
如 非靜態局部或自動變量。
一個局部變量,如果沒有用static修飾則自動為auto,即這種情況下生存期為函數調用到函數返回這個時間段。
對於非靜態局部變量,生存期和作用域都為其所在定義的函數
對於靜態局部變量,它的生存期是整個程序生命周期,但作用域依舊為定義它的函數內部
全局變量與靜態局部變量如果未初始化,值為0
非靜態局部變量未初始化,值不定。
1. 一般情況下全局變量定義函數外,局部變量定義函數內;全局變量作用范圍是全局,局部變量作用范圍在函數內;
2. 靜態變量定義在函數外,則為靜態全局變量,作用范圍為當前文件;定義在函數內,則為局部靜態變量,作用范圍同局部變量;
3. 如果在全局范圍要經常用到某個值,則設置為靜態變量,否則定義為普通全局變量即可;
4. c、c++和java可以定義靜態變量,go和python不能定義靜態變量;