#include <stdio.h>
int main() {
int a = 20;
int score;
{
a = 10;
score = a + 250;
int score = 30;
printf("%d\n", score);
}
printf("%d\n", score);
return 0;
}
執行結果輸出為:
30
260
初學者常困惑:為什麼第二個輸出是 260 而不是 30? 明明在內層區塊宣告了 int score = 30,外層應該也被影響才對?
這是典型的變數遮蔽問題。在 C/C++ 中,內層區塊宣告的同名變數會遮蔽外層區塊的同名變數,兩者是完全獨立的記憶體空間。
{ // 外層區塊 A
int score[addr1]; // 生命週期:整個 A 區塊
...
{ // 內層區塊 B
score[addr1] = a + 250; // 操作外層 score (addr1)
int score[addr2] = 30; // 宣告新變數 score (addr2),遮蔽外層
printf score[addr2]; // 輸出 30 (addr2)
} // 區塊 B 結束,addr2 釋放
printf score[addr1]; // 輸出 260 (addr1)
} // 區塊 A 結束
int score (位址 addr1),未初始化a = 10score = a + 250 → 外層 score (addr1) 被賦值 260int score = 30 → 宣告新變數 score (位址 addr2),遮蔽外層printf 輸出內層 score (addr2) = 30printf 輸出外層 score (addr1) = 260若難以理解,可使用 Visual Studio 單步除錯,監控 &score 位址變化:
&score 為 addr2&score 為 addr1-Wshadow)偵測遮蔽問題兩個 score 是完全獨立的變數,內層宣告 int score = 30 只是建立新變數遮蔽外層,並不會修改外層變數值。理解作用域規則是 C/C++ 程式設計的基礎關鍵。