30 考慮以下的C語言程式:

則執行結果為何?
(A) 15
(B) 18
(C) 20
(D) 24

答案:登入後查看
統計: A(2), B(3), C(1), D(3), E(0) #3966694

詳解 (共 1 筆)

#7448885

步驟解析

  1. 初始值

    • x = 3

  2. 呼叫 f(x, &x)

    • 傳入參數:x = 3(值呼叫),&x(位址呼叫)。

    • 在函式 f 內:

      • *y = x + 1 = 3 + 1 = 4 → 所以主程式中的 x 被改成 4。

      • return x + 2 = 3 + 2 = 5 → 函式回傳值為 5。

  3. 回到主程式

    • 原本的敘述是:x = x * f(x, &x);

    • 這裡的重點是「運算子求值順序」:

      • C 語言規範中,函式呼叫的引數求值順序是 未定義 (unspecified)

      • 但在大多數編譯器(如 GCC、Clang、MSVC),會先計算引數,再執行乘法。

    • 所以流程是:

      • 呼叫 f(3, &x) → 回傳 5,並且把 x 改成 4。

      • 接著計算 x * 5 = 4 * 5 = 20。

      • 最後 x = 20。

  4. 輸出

    • printf("%d", x); → 印出 20

ㅤㅤ

正確答案: (C) 20

這題的陷阱在於 值呼叫 vs 位址呼叫,以及 引數求值順序。函式內部用 *y = x+1 改掉了主程式的 x,所以乘法時用的是更新後的值。

0
0