下例說明範圍規則的使用
#include <stdio.h>
void test1(void);
void test2(void);
int a = 0;
int main(void)
{
int a = 1;
printf("a = %d\n", a);
test1();
test2();
printf("\n");
{
int a = 2;
printf("a = %d\n", a);
test1();
test2();
printf("\n");
}
{
printf("a = %d\n", a);
test1();
test2();
printf("\n");
}
return 0;
}
void test1(void)
{
int a = 3;
printf("a = %d\n", a);
}
void test2(void)
{
printf("a = %d\n", a);
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:scopetest.c
功能:示範變數的範圍規則
作者:張凱慶
時間:西元2010年7月 */我們分別在第 6 行、第 10 行、第 18 行及第 37 行都宣變數 a ,同時依序給 0 、 1 、 2 、 3 的值。先來編譯看看執行結果

程式依序印出三組數字,然後用空行分開。印出第一組數字的程式碼為
printf("a = %d\n", a);
test1();
test2();
printf("\n");這裡,印出的第一個 a 為函數 main() 所定義的 a ,印出第二個 a 則是函數 test1() 所定義的 a ,而 test2() 沒有定義任何的變數 a ,所以印出的第三個 a 是定義在第 6 行,也就是宣告在所有函數外的 a 。
印出第二組數字的程式碼為
{
int a = 2;
printf("a = %d\n", a);
test1();
test2();
printf("\n");
}這是在一個程式區塊內,同時宣告定義了另一個 a ,所以印出的第一個 a 為程式區塊定義的 a ,然後依序呼叫 test1() 及 test2() 印出第二個 a 及第三個 a 。
印出第三組數字的程式碼為
{
printf("a = %d\n", a);
test1();
test2();
printf("\n");
}這是另一個程式區塊,由於裡頭沒有宣告定義任何的變數 a ,所以印出的第一個 a 為之前第 10 行定義的 a ,也就是說在之前程式區塊內所定義的 a ,離開程式區塊後就失去效力。接著依序呼叫 test1() 及 test2() 印出第二個 a 及第三個 a 。
函數定義本身屬於個別的程式區塊,因此不同函數可定義相同名稱的變數,互相不會干擾各自的執行。任何程式區塊內定義的變數,通常都稱為區域變數,表示他們的效力只在某個特定的區域,而像定義在所有函數外的變數,有時被稱為全域變數,代表所有函數均可使用,無須另外宣告定義。
利用全域變數有其方便的地方,但也常常帶來不良的副作用,因此使用全域變數要謹慎跟小心,沒有必要的話,大多使用區域變數即可。
問題與討論
- 比較全域變數與區域變數的異同。
- 全域變數有可能會帶來什麼樣的副作用?
沒有留言:
張貼留言