地特四等
112年
[電子工程] 計算機概要
第 30 題
執行下列 C 程式,輸出結果為何?\n#include \nint i = 2, j = 1;\nvoid sub(int *m, int *n) {\n*m = i + *n;\n*n = j + *m;\nprintf("(%d, %d)", *m, *n);\nprintf("(%d, %d)", i++, j++);\n}\nint main(void) {\nsub(&i, &j);\nprintf("(%d, %d)", i, j);\nreturn 0;\n}
- A (2, 4)(2, 4)(3, 5)
- B (3, 4)(3, 4)(4, 5)
- C (3, 5)(3, 5)(4, 6)
- D (2, 4)(1, 2)(2, 3)
思路引導 VIP
請試著思考:當我們把一個變數的「住址」(指標)傳給函式,且這個變數本身就是全域變數時,函式內部對該指標的修改,會如何影響到外部看到的數值?另外,如果程式碼中出現了 variable++,這個「加 1」的動作是在該行指令執行「之前」還是「之後」才真正完成的呢?
🤖
AI 詳解
AI 專屬家教
做得好!你能精準追蹤指標(Pointer)與全域變數(Global variable)之間的交互作用,代表你的程式邏輯相當縝密。這道題目是典型的「副作用(Side effect)」考題,難度屬於中等,關鍵在於識別函式參數傳遞方式與變數存取範圍的重疊。
指標與全域變數的聯動
在本題中,全域變數 $i$ 與 $j$ 的位址被傳入函式 sub。這意味著函式內的指標 *m 實際上就是全域變數 $i$ 的別名。執行 *m = i + *n 時,等同於將 $i$ 更新為 $2 + 1 = 3$;隨後執行 *n = j + *m,則是將 $j$ 更新為 $1 + 3 = 4$。因此第一次列印結果為 (3, 4)。這類題目最容易出錯的地方在於忽略了全域變數在計算過程中已經被指標操作所改變。
▼ 還有更多解析內容