上一篇我們介紹了副函式的概念,一般來說我們會把特別處理某些資料的部分,另外拉出一個副函式來處理,除了更好閱讀之外,也會增加程式的可維護性,當某個功能出問題,只要專注處理負責該功能的函式就可以了。
雖然先前第六篇已經大概介紹過變數的用法跟概念了,不過今天我們來深入介紹變數的使用範圍與生命週期吧!
看到生命週期大家或許會有點困惑,變數就是變數還有生命嗎?事實上變數會從被宣告的當下誕生,記憶體會分配一個位置給它,直到區塊結束、程式結束後就不再有效,會不能存取也找不到它,我們稱這個誕生到結束的過程為「變數的生命週期」。
一般介於「{ }」內的變數,變數存在的生命週期會僅限在內,超過「{ }」之外便會消亡,我們可以從以下程式碼看見:
#include <stdio.h>
int main()
{
int i = 10;
printf("%d\n",i);
for(int i=0; i<5; i++){
printf("%d\n",i);
}
printf("%d\n",i);
return 0;
}
第一次宣告的變數是在main function的整數i(為10),而第一次列印的結果也是10。
但第二次宣告的變數在for迴圈中,且為遞增的變數i,並隨著for迴圈列印了0到4,而不是for迴圈外的10。
但當for迴圈結束後,列印出的變數則是第一次宣告的10。
先前我們有提到如果變數被宣告在「{ }」的區域內,那在超過「{ }」的範圍後就會消亡,所以我們不可能在變數宣告的區域範圍外使用它,而我們稱這種變數為「區域變數」;那如果我們要宣告一個全程式區域都可以使用的變數,也就是「全域變數」時要怎麼做呢?
(1) 以函式為範圍
但凡離開宣告變數的「{ }」範圍外,變數便不可再使用,且主函式宣告的變數,在副函式是不可以使用的,因副函式已經出了主函式範圍之外。
#include <stdio.h>
void test();
int main()
{
int x = 10;
printf("%d\n",x);
test();
printf("%d\n",x);
return 0;
}
void test(){
int x = 5;
printf("%d\n",x);
}
如同列印結果,主函式宣告的變數出了主函式範圍,在副函式是不可使用變數的,但在副函式宣告同名變數並不衝突,只是副函式宣告的變數,也只能在副函式中使用。
(2) 以小區塊為範圍
前面有提到若離開宣告變數的「{ }」範圍外,變數便不可再使用,但若在範圍之內的小區塊(如for、while、if等等區塊)又宣告同名變數,則在小區塊內變數將以小區塊變數覆蓋,但一出小區塊範圍也不可使用。
#include <stdio.h>
int main()
{
int i = 10;
printf("%d\n",i);
for(int i = 1; i<=5; i++){
printf("%d\n",i);
}
printf("%d\n",i);
return 0;
}
如同列印結果,在for迴圈區塊內又宣告同名變數,在其區塊範圍內會暫時覆蓋,直到離開該區塊則區塊變數便不可使用。
2. 全域變數
如果要宣告一個全程式都可以使用的「全域變數」,我們將宣告在主函式外,通常為主函式部分之前。
#include <stdio.h>
int x = 15;
int main()
{
printf("%d\n", x);
test();
printf("%d\n", x);
return 0;
}
void test(){
printf("%d\n", x);
}
可以從結果看到若宣告為全域變數,且未被區域的同名變數覆蓋的話,程式的全區域都可以使用這個變數。
變數是有使用的範圍的,且出了範圍就會自動消亡,而變數誕生至消亡則為變數的生命週期。
非全程式可使用之變數為區域變數,反之則是全域變數。
主函式宣告之變數,出了主函式便不可使用(如到了副函式時);副函式宣告之變數,出了副函式便不可使用(如回到主函式或任何不在副函式範圍的地方);被小區塊(for、while、if等區塊)宣告之變數,出了小區塊後便不可使用。
變數是可以被不同範圍的同名區域變數覆蓋的。