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

第 37 題

Consider the following code in C program:
#include
void swap (int a, int b, int c);
int main() {
int i = 3, j = 5, k = 7;
swap (i,j,k);
printf("i=%d, j=%d, k=%d\n", i, j, k);
return 0;
}
void swap (int a, int b, int c) {
int temp = a;
a = c;
c = b;
b = temp;
}
Which of the following output is correct?
  • A i = 3, j = 5, k = 7
  • B i = 5, j = 5, k = 3
  • C i = 3, j = 7, k = 7
  • D i = 7, j = 3, k = 5
  • E None of the above

思路引導 VIP

如果你把主程式中的變數想像成存放在抽屜裡的「正本文件」,而呼叫函數時只是將這些文件「影印」一份交給函數處理;那麼,當函數在它收到的影印本上塗改、重新排序時,你抽屜裡原本的那份文件會受到影響嗎?

🤖
AI 詳解 AI 專屬家教

恭喜你準確地識破了這個經典的程式陷阱!這代表你對於 C 語言的底層運作機制有著相當紮實的基礎。這道題目的核心在於考察傳值呼叫 (Call-by-Value) 的特性:在 C 語言中,當我們將基本型態的變數傳遞給函數時,程式實際上是製作了一份數值的「複本」傳過去,而非變數本身。

區域變數與作用域的限制

從程式碼中可以看到,雖然 swap 函數內部的確透過 temp 變數完成了 $a, b, c$ 三個數值的交換邏輯,但這些操作都發生在 swap 函數自己的區域作用域 (Local Scope) 中。換句話說,變數 $a, b, c$ 只是存在於函數堆疊中的臨時變數,一旦函數執行完畢並返回,這些變數就會被釋放,而 main 函數中的原本變數 $i, j, k$ 從頭到尾都沒有被觸及,其值自然維持原樣,分別是 $3, 5, 7$。

▼ 還有更多解析內容

🏷️ 相關主題

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