BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0026 
发信站: ☆清华电机☆ (Wed Jun  7 22:16:20 1995) 
 
 
第 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 这个档案中的函数都可以取用,所以叫做全域变数。 
 
-- 
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。 
 
 

BBS水木清华站∶精华区