作用域定義了變量「可見」的程序區域。C 語言中變量可聲明於三處:函數/塊內部(局部)、所有函數外部(全局)、函數參數列表中(形式參數)。理解它們的生命週期與遮蔽規則,是編寫無 Bug 代碼的基石。
在函數或代碼塊內聲明,僅在該塊內可見,函數調用結束時銷毀。未初始化的局部變量值不確定(垃圾值)。
#include <stdio.h>
int main() {
int a = 10, b = 20, c = a + b;
printf("a=%d, b=%d, c=%d\n", a, b, c);
return 0;
}
聲明於所有函數外部(通常在文件頂部),程序啟動時創建、結束時銷毀,自動初始化為 0/NULL,全程可訪問。
#include <stdio.h>
int g; // 全局變量,隱式初始化為 0
int main() {
int a = 10, b = 20;
g = a + b;
printf("g = %d\n", g);
return 0;
}
局部變量可與全局變量同名,在局部作用域內局部遮蔽全局:
#include <stdio.h>
int g = 20; // 全局 g
int main() {
int g = 10; // 局部 g 遮蔽全局
printf("g = %d\n", g); // 輸出 10
return 0;
}
函數參數屬於局部變量,調用時創建、返回時銷毀,同樣遮蔽同名全局變量。C 語言採用傳值調用,函數內修改參數不影響實參:
#include <stdio.h>
int a = 20; // 全局 a
int sum(int a, int b) { // 形式參數 a, b
printf("sum 中 a = %d\n", a); // 10
return a + b;
}
int main() {
int a = 10; // 局部 a
printf("main 中 a = %d\n", a); // 10
printf("sum 返回 %d\n", sum(a, 20)); // 30
return 0;
}
| 數據類型 | 全局/靜態默認值 | 局部(自動)默認值 |
|---|---|---|
| int | 0 | 未定義(垃圾值) |
| char | '\0' | 未定義 |
| float/double | 0.0 | 未定義 |
| pointer | NULL | 未定義 |
最佳實踐: 總是顯式初始化局部變量,避免因垃圾值導致的不可預測行為。