初考-統計資料處理大意105 年第 11 題單選題
下列程式的輸出結果為何?
X=100
Call M(X)
IF X=100 Then
Print "A";
Else
Print "B";
End IF
Sub M(B)
B=B+1
End Sub
B正確答案
本題考查副程式的「傳址呼叫(Call by Reference)」。在傳統 Basic 虛擬碼中,未特別標示時預設為傳址,副程式內的修改會連動改變主程式變數,導致 X 變成 101,進而輸出 B。
為什麼答案是 B
因預設為傳址呼叫,副程式中的 B 與主程式的 X 共用記憶體。B=B+1 使 X 變成 101。回到主程式判斷 IF X=100 為 False,故執行 Else 印出 B。
載入中…
完整詳解
Pro · 無限重點 本題考查副程式的「傳址呼叫(Call by Reference)」。在傳統 Basic 虛擬碼中,未特別標示時預設為傳址,副程式內的修改會連動改變主程式變數,導致 X 變成 101,進而輸出 B。
看到 Sub M(B) 沒寫 ByVal,預設就是傳址(ByRef)。B=B+1 讓外面的 X 變成 101。101=100 不成立,走 Else 印出 B。
逐選項分析
A✕ 陷阱
若參數傳遞為「傳值呼叫(Call by Value)」,副程式的變動不會影響外部變數,X 才會保持 100 並印出 A。但本題虛擬碼預設為傳址呼叫。
B✓ 正確
因預設為傳址呼叫,副程式中的 B 與主程式的 X 共用記憶體。B=B+1 使 X 變成 101。回到主程式判斷 IF X=100 為 False,故執行 Else 印出 B。
C✕
程式的 Print 指令是輸出字串 "A" 或 "B",並未要求輸出變數 X 的數值,此為混淆選項。
D✕
雖然 X 的值確實變成了 101,但程式碼中並沒有 Print X 的指令,只會印出字串 "A" 或 "B"。
參數傳遞方式比較
| 傳遞方式 | 英文名稱 | 運作原理 | 對外部變數的影響 |
|---|
| 傳值呼叫 | Call by Value | 複製變數的值傳給副程式 | 副程式內的修改【不會】影響外部變數 |
| 傳址呼叫 | Call by Reference | 將變數的記憶體位址傳給副程式 | 副程式內的修改【會】連動改變外部變數 |
考生常將現代程式語言(如 Java, C, Python)預設的「傳值呼叫」套用到傳統 Basic 虛擬碼上,誤以為 X 不會改變而錯選 A。在國家考試的 Basic 虛擬碼中,若無特別標示 ByVal,通常預設為 ByRef (傳址)。