發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標 題: 星星流講座 0026
發信站: ☆清華電機☆ (Wed Jun 7 22:16:20 1995)
轉信站: star
星星流講座 0026 C 語言講座
第 5 講 之 2 變數的範圍
Topic: Variable Scope (1)
在進一步探討指標之前,我們先來討論一下變數的生存範圍 (scope)。
程式中的變數可以分為三種:全域變數 (global variable)、區域變數 (local
variable) 以及外來變數 (external variable)。我們現在討論全域變數和區
域變數,外來變數以後在比較高等的課題再研究。
全域變數就是宣告於函數本體之外的變數,區域變數就是宣告於函數本體之內
的變數。例如:
/* var.c */
#include <stdio.h>
int a; /* global variable */
void main (void)
{
int b; /* local variable */
}
上面的例子中, a 這個變數不屬於任何一個函數,我們就管它叫全域變數
,而相對地 b 這個變數宣告於 main 函數中,我們將它視為屬於 main 函
數的變數,因此把它歸類為區域變數,因為它是屬於某一個區域的。
C 語言中,變數有兩種生存的範圍,一個是檔案範圍 (file scope),一個是
函數範圍 (function scope)。什麼叫做生存範圍呢?生存範圍又是如何影響
變數的?我們以下面的例子來說明:
/* var.c */
#include <stdio.h>
int a; /* global variable */
void foo (void);
void main (void)
{
int b; /* local variable */
a = 1;
b = 2;
foo ();
}
void foo (void)
{
printf ("%d %d\n", a, b);
}
這個程式在編譯的時候就會發生錯誤,編譯器會告訴你 foo 函數中的 b 這
個變數未定義。奇怪了,我已經在 main 中定義了啊?這就是函數生存範圍
所構成的限制。我們的例子裡,b 是定義在 main 函數裡頭的,只要一離開
main 函數之外,b 就不存在了。
檔案 var.c
┌──────────────────────────┐
│ 函數 main │
│ ┌───────┐ ┌────┐ │
│ │ │ │ │ │
│ │ int b; │ └────┘ │
│ │ │ 函數 foo │
│ └───────┘ int a; │
└──────────────────────────┘
更進一步地來講,函數 main 和函數 foo 是被包在 var.c 裡頭的,而 a
也是包在 var.c 裡頭的,所以 main 和 foo 都可以「看得見」a。但是,
b 是包在 main 函數裡頭的,所以 foo 看不見它,要同樣被包在 main 裡
頭的東西才可以「看得見」它。要使用一個變數,當然先決條件是要能「
看得見」它,所以上面的程式中編譯器會給你 b 未定義的錯誤訊息,這是
因為照 C 語言的規矩,foo 是沒法看見 b 的。
由於 b 只限制於 main 函數中才可以取用,所以叫做區域變數;而 a 只要
是 var.c 這個檔案中的函數都可以取用,所以叫做全域變數。