C 速查手冊
單元 8 - 範圍規則
C 語言識別字 (identifier) 會有四種不同的效力範圍,如下
檔案範圍 |
函數範圍 |
區塊範圍 |
函數原型範圍 |
宣告在任何函數 (funciton) 之外的識別字 (identifier) 名稱都具有檔案範圍,如下例
#include <stdio.h>
void other(void);
int i = 0;
int main(void)
{
printf("in main, i = %d\n", i++);
other();
printf("in main, i = %d\n", i++);
other();
printf("in main, i = %d\n", i++);
return 0;
}
void other(void)
{
printf("in other, i = %d\n", i++);
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:filescope.c
功能:示範具檔案範圍的變數
作者:張凱慶 */
編譯後執行,結果如下
$ gcc filescope.c |
$ a.out |
in main, i = 0 |
in other, i = 1 |
in main, i = 2 |
in other, i = 3 |
in main, i = 4 |
$ |
檔案範圍的意思是說整個檔案的任何函數均可使用,這樣使具有檔案範圍的識別字名稱形成全域變數 (global variable) 的效果。
具有函數範圍的識別字只有標籤,形如
lable:
識別字加上冒號,包括 switch 及 goto 所用的標籤,標籤可以在函數的任何位置使用,一旦超出函數的範圍,就無法利用函數內的標籤。
所謂的區塊範圍是指用大括弧 {} 圍起來的區域,如下例
#include <stdio.h>
int main(void)
{
int i = 0;
printf("i = %d\n", i++);
{
printf("in block, i = %d\n", i++);
int i = 99;
printf("in block, i = %d\n", i++);
}
printf("i = %d\n", i++);
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:blockscope.c
功能:示範具有區塊範圍的變數
作者:張凱慶 */
編譯後執行,結果如下
$ gcc blockscope.c |
$ a.out |
i = 0 |
in block, i = 1 |
in block, i = 99 |
i = 2 |
$ |
在區塊內重新宣告變數 i ,這是在區塊內的區域變數,並不會影響到區塊外的範圍。
至於效力範圍最窄的就是函數原型範圍,僅限於函數原型小括弧的參數列中。