static int a = 5; // 全局靜態變量,僅本文件可見,生命週期贯穿程序
void p1() {
printf("a*a=%d\n", a*a); // 使用全局 a (初始為5) → 25
a = 2; // 修改全局 a 為 2
}
void p2() {
printf("a*a*a=%d\n", a*a*a); // 使用修改後的全局 a (2) → 8
}
int main() {
printf("a=%d\n", a); // 5
p1(); // 輸出 25,並將 a 改為 2
p2(); // 輸出 8
return 0;
}
| 概念 | 說明 |
|---|---|
| 全局變量 | 定義於函數外部,默認外部鏈接,全程序可見(除非 static 限制) |
| static 全局變量 | 僅當前源文件可見(內部鏈接),但生命週期仍為程序全周期 |
| 函數調用順序 | main → p1 → p2,p1 修改全局變量直接影響 p2 讀取值 |
| 無局部變量遮蔽 | p1、p2 內未定義局部 a,故直接操作全局 a |
void p2() {
int a = 10; // 定義局部變量 a,遮蔽全局 a
printf("a*a*a=%d\n", a*a*a); // 輸出 1000 (10^3)
}
此時 p2 使用局部 a=10,全局 a 不受影響,後續調用仍為 2。
static 限制作用域理解變量作用域、生命週期與遮蔽規則,是寫出無副作用代碼的關鍵。