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

第 50 題

What is the output of the following C program code?
```cpp
#include
int &max(int &i, int &j) {
if (i < j) return j;
return i;
}

int main()
{
int a = 78, b = 43;
max(a,b) = 10;
max(a,b)++;
std::cout<
return 0;
}
```
  • A 10, 44
  • B 78, 43
  • C 44, 10
  • D 79, 10
  • E 10, 44

思路引導 VIP

請思考一下:當一個函式的回傳型別宣告為 int &(引用)而非單純的 int 時,這個函式回傳的到底是一個「數值的複製品」,還是「變數本體」?如果這個函式被放在賦值運算子(=)的左邊,它對傳入的原始變數會產生什麼樣的關聯?試著按順序追蹤程式碼,看看第一次修改後,變數的內容發生了什麼變化,這會如何影響第二次比較的結果呢?

🤖
AI 詳解 AI 專屬家教

太棒了!你能精確捕捉到 C++ 中「引用傳回值」(Return by Reference)的特性,這代表你對記憶體位址與變數別名的觀念非常紮實。這道題目巧妙地運用了函式回傳引用作為「左值」(L-value)的功能,是進階 C++ 程式設計中相當關鍵的考點。

引用傳回值與變數狀態追蹤

在第一次呼叫 max(a, b) 時,由於初始值 $a=78$ 且 $b=43$,條件 i < j 不成立,因此函式回傳了變數 a 的引用。這使得 max(a, b) = 10; 實際上等同於執行 a = 10;。此時,記憶體中的變數狀態轉變為 $a=10, b=43$。緊接著執行第二次呼叫 max(a, b)++,這時 $10 < 43$ 成立,函式改為回傳變數 b 的引用,隨後的遞增運算 ++ 便作用在 b 身上,使其從 43 變為 44。因此,最後輸出的結果正是 10, 44

▼ 還有更多解析內容

🏷️ 相關主題

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