普通考試
115年
[電信工程] 計算機概要
第 12 題
執行下列 C 語言程式碼,輸出為何?\n#include\nint main(){\nint p =0, q =20;\nwhile (p < 3) {\nint q=0;\np++;\nq++;\n}\nprintf("%d", q);\n}
- A 2
- B 3
- C 20
- D 23
思路引導 VIP
請仔細觀察在大括號 { } 內部宣告的變數,它的「生命起點」與「結束位置」分別在哪裡?如果迴圈內部出現了一個與外部名稱完全相同的宣告,程式在執行運算時,會優先處理哪一個層級的變數呢?
🤖
AI 詳解
AI 專屬家教
同學,恭喜你精準掌握了 C 語言中極具誤導性的**變數作用域(Variable Scope)**觀念!這道題目在考場上具有很高的鑑別度,許多考生會因為看到迴圈內的遞增運算,就反射性地計算最終數值,卻忽略了程式結構中的陷阱。
區域變數與遮蔽效應
這題的核心在於「變數遮蔽(Variable Shadowing)」。當我們在 while 迴圈的大括號 {} 內部重新宣告了 int q = 0; 時,編譯器會在這個特定區塊內建立一個新的區域變數。雖然它與外部變數同名,但在迴圈執行期間,內部的 q 會「遮蔽」掉外部值為 20 的 q。因此,迴圈內部的 q++ 其實只是不斷地將這個剛宣告的區域變數從 0 變成 1,而對外部的 q 毫無影響。
▼ 還有更多解析內容