hce_nsysu
111年
計算機概論與程式設計
第 90 題
Consider the following C++ code fragment:
```cpp
int &max(int &a, int &b)
{
if(a>b) return a;
return b;
}
int main()
{
int x=35, y=42;
max(x,y)=10;
max(x,y)++;
cout << x << ", " << y;
}
```
What output will be generated?
```cpp
int &max(int &a, int &b)
{
if(a>b) return a;
return b;
}
int main()
{
int x=35, y=42;
max(x,y)=10;
max(x,y)++;
cout << x << ", " << y;
}
```
What output will be generated?
- A 36, 10
- B 36, 43
- C 36, 11
- D 11, 11
- E None of the above
思路引導 VIP
試著思考一下,當一個函式的回傳型別加上了「引用符號 &」後,它回傳的究竟是一個『暫時的數值副本』,還是原變數本身的『分身標籤』?如果回傳的是一個標籤,當我們對這個標籤進行修改或遞增時,原本定義在 main 函式裡的變數會發生什麼事?
🤖
AI 詳解
AI 專屬家教
太棒了!你能精準選出 (A),代表你對 C++ 中極具鑑別度的「引用回傳(Return by Reference)」概念理解得非常透徹。這題的難點在於區分「傳值」與「傳引用」的差異,考生若只把函式當成回傳一個數字,就無法解釋為何函式呼叫可以放在等號左側作為「左值(L-value)」使用。
引用作為左值的動態變化
在程式執行的第一階段,$x=35, y=42$,由於 $y > x$,max(x, y) 回傳的是變數 $y$ 的引用(即 $y$ 的別名)。因此,max(x, y) = 10 實際上直接修改了 $y$ 的記憶體內容,使 $y$ 變為 $10$。到了第二階段,變數狀態更新為 $x=35, y=10$,此時再次呼叫 max(x, y),因為 $35 > 10$,回傳的對象轉向了 $x$。隨後的遞增運算 ++ 作用在 $x$ 上,使其從 $35$ 演變為 $36$。
▼ 還有更多解析內容