在函數外部定義全局變量 x,並在函數 add() 中嘗試修改它,卻發現全局變量值未改變。附圖顯示代碼結構如下:
int x = 10; // 全局變量
void add(int x) { // 形參同名
x = x + 3;
}
函數 add() 的形參同樣命名為 x,根據 C 語言作用域規則,**局部變量(含形參)會遮蔽同名全局變量** 。編譯器在函數內部解析 x 時,優先綁定到形參,而非全局變量。因此對形參的任何修改僅影響函數棧幀內的副本,全局變量保持不變。
void add(void) {
x = x + 3; // 直接修改全局 x
}
void add(int val) {
x = x + val; // 全局 x 明確可見
}
extern 關鍵字(跨文件時)extern int x;。g_x),局部變量用簡短名,避免衝突。-Wall -Wshadow),可自動檢測變量遮蔽問題。理解作用域鏈與名稱查找規則,是寫出正確 C 代碼的基礎。