發信人: 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 這個檔案中的函數都可以取用,所以叫做全域變數。