30 考慮以下的C語言程式:
則執行結果為何?
(A) 15
(B) 18
(C) 20
(D) 24
答案:登入後查看
統計: A(2), B(3), C(1), D(3), E(0) #3966694
統計: A(2), B(3), C(1), D(3), E(0) #3966694
詳解 (共 1 筆)
#7448885
步驟解析
-
初始值:
-
x = 3
-
-
呼叫 f(x, &x):
-
傳入參數:x = 3(值呼叫),&x(位址呼叫)。
-
在函式 f 內:
-
*y = x + 1 = 3 + 1 = 4 → 所以主程式中的 x 被改成 4。
-
return x + 2 = 3 + 2 = 5 → 函式回傳值為 5。
-
-
-
回到主程式:
-
原本的敘述是:x = x * f(x, &x);
-
這裡的重點是「運算子求值順序」:
-
C 語言規範中,函式呼叫的引數求值順序是 未定義 (unspecified)。
-
但在大多數編譯器(如 GCC、Clang、MSVC),會先計算引數,再執行乘法。
-
-
所以流程是:
-
呼叫 f(3, &x) → 回傳 5,並且把 x 改成 4。
-
接著計算 x * 5 = 4 * 5 = 20。
-
最後 x = 20。
-
-
-
輸出:
-
printf("%d", x); → 印出 20。
-
ㅤㅤ
✅ 正確答案: (C) 20
這題的陷阱在於 值呼叫 vs 位址呼叫,以及 引數求值順序。函式內部用 *y = x+1 改掉了主程式的 x,所以乘法時用的是更新後的值。
0
0