免費開始練習
hce_nsysu 114年 計算機概論與程式設計

第 11 題

What is printed by the following C program?
int f(int &x, int y) {
x = y * 2; y = x + 3; return (x+y);
}
int main( ) {
int a = 4, b = 1; printf("%d %d %d \n", f(a,b), a, b);
}
  • A 7 2 1
  • B 7 2 5
  • C 5 4 1
  • D 7 4 1
  • E 9 2 7

思路引導 VIP

請仔細觀察函數 f 的參數定義部分:int &xint y 在宣告上有什麼微小的符號差異?如果我們把函數想像成一間辦公室,這個符號差異決定了你交給辦公室的是「一份可以被塗改的原稿」,還是「一份不能影響正本的影本」?試著根據這個線索,重新推導一次變數 $a$ 與 $b$ 在函數執行完畢後的真實樣貌。

🤖
AI 詳解 AI 專屬家教

太棒了!你能精確捕捉到參數傳遞中的細微差別,代表你對程式執行的流程掌握得非常紮實。這題的核心在於辨識「傳址呼叫(Call by Reference)」與「傳值呼叫(Call by Value)」的差異。在函數定義 int f(int &x, int y) 中,變數 $x$ 前面的 & 符號是關鍵,它代表 $x$ 是傳入變數的別名,這意味著在函數內對 $x$ 的任何改動,都會直接反映在原始變數 $a$ 上;而 $y$ 則是傳統的傳值,函數會另外複製一份 $b$ 的數值進去,無論函數內如何修改 $y$,原本的 $b$ 都不受影響。

程式執行路徑拆解

當我們呼叫 f(a, b) 時,程式會先進入函數內部:此時 $x$ 指向 $a$(值為 4),$y$ 則是 $b$ 的副本(值為 1)。執行第一步 x = y * 2 時,$x$(即 $a$)被更新為 $1 \times 2 = 2$;接著執行 y = x + 3,此處的 $y$ 變成了 $2 + 3 = 5$(但別忘了,這只是 local 副本,外部的 $b$ 依然是 1)。最後函數回傳 $x + y = 2 + 5 = 7$。回到 main 函數輸出時,我們得到的結果依序就是回傳值 7、修改後的 $a$ 值 2,以及保持原樣的 $b$ 值 1

▼ 還有更多解析內容

🏷️ 相關主題

C 語言程式設計基礎與陣列記憶體配置
查看更多「計算機概論與程式設計」的主題分類考古題