Jason 發問時間: 電腦與網際網路程式設計 · 6 年前

C 語言-102普考考題

請問下面link之第36題,

http://wwwc.moex.gov.tw/ExamQuesFiles/Question/102...

需如何推算?

自行推算如下 ml=PLUS(8,2)*MINUS(-2,8)

所以ml=6*6 =36

但答案為-3,

何處觀念有錯?

另外第35題,

p2是否因為第3行 void f(int x) (n=x;)

其中之void 使n=1 不回傳,

所以列印n, 仍等於原宣告之0

Thanks

C 語言初學者

3 個解答

評分
  • ps
    Lv 5
    6 年前
    最佳解答

    36題:

    因為#define就是純粹直接取代

    所以原式為:

    m1=m1+m2-m1-m2*m2-m1+m2+m1

    =5+3-5-3*3-5+3+5= -3

    35題:

    不是, 是因為有兩個n的變數, 一個是在main()外頭的global的n

    另一個是main()裡頭的local 的n

    P2的f(1);只改變了global n, 而printf印出的是local的n

    P1的f(1);因為是define, 直接取代code成為n=1; 改到的是local的n

    所以兩者才會不同

    2013-10-24 15:12:25 補充:

    補上原問題:

    35.

    有關執行下列兩個C語言程式結果的比較,何者正確?

    程式P1:

    #include

    int n=0;

    #define f(x) n = x;

    main() {

    int n = 0;

    f(1);

    printf(“%d\n”, n);

    }

    程式P2:

    #include

    int n=0;

    void f(int x) {n = x;}

    main() {

    int n = 0;

    f(1);

    printf(“%d\n”, n);

    }

    2013-10-24 15:12:53 補充:

    補上原問題:

    36.

    下列以C程式語言撰寫之程式執行後產生之輸出為何?

    #define PLUS(a, b) a-b

    #define MINUS(a, b) a+b

    #include

    main()

    { int ml=5, m2=3;

    ml = PLUS(m1+m2, m1-m2)*MINUS(m2-m1, m2+m1);

    printf(“%d\n”, ml);

    }

    2013-10-25 10:39:25 補充:

    謝謝Tai的幫忙回答

    我再補充說明一下:

    因為有#define PLUS(a, b) a-b

    所以當Compiler(編譯器)看到PLUS(m1+m2, m1-m2)時,它就會把

    m1+m2當a, m1-m2當b,於是a-b就"直接"變成m1+m2 - m1-m2

    同理MINUS(m2-m1, m2+m1)就"直接"變成m2-m1+m2+m1

    原式就"直接"變成m1=m1+m2-m1-m2*m2-m1+m2+m1;

    解決了define的東西後,

    再代值進去算,會先乘除後加減, 就是m1=5+3-5-3*3-5+3+5= -3

    2013-10-25 10:43:33 補充:

    是的

    因為沒括號, 3*3會先做,C的運算子有優先順序的

    m1=5+3-5-3*3-5+3+5=m1=5+3-5-9-5+3+5= -3

    • 登入以對解答發表意見
  • Tai
    Lv 5
    6 年前

    define XX YY 純粹只是文字上 YY 取代 XX,沒有數學符號優先順序。

    #define PLUS(a,b) a-b

    PLUS(m1+m2, m1-m2)

    純粹將 a 代入 m1+m2, b 代入 m1-m2

    m1+m2-m1-m2 <== -m2 與期待中的運算不同

         

    除非你改寫成

    #define PLUS(a,b) (a)-(b)

    PLUS(m1+m2, m1-m2) 才會被置換成 (m1+m2)-(m1-m2)

    2013-10-25 03:52:58 補充:

    而 PLUS 和 MINUS 要符合版大的運算期待 36,要改寫成

    #define PLUS(a,b) ((a)-(b))

    #define MINUS (a,b) ((a)+(b))

    2013-10-25 04:56:54 補充:

    純粹將 a 代入 m1+m2, b 代入 m1-m2 =>

    純粹將 m1+m2 代入 a , m1-m2 代入 b

    • 登入以對解答發表意見
  • 6 年前

    請問36題之回答:

    因為#define就是純粹直接取代

    "純粹直接取代"是何意思?取代那個部份 ?

    =5+3-5-3*3-5+3+5= -3,

    上式符號是否有優先順序? 中間乘號如何處理?

    Thanks

    2013-10-25 10:27:13 補充:

    =5+3-5-3*3-5+3+5= -3,

    所以代入後 因3*3會先做

    變成==>5+3-5 -9 -5+3+5

    然後==> -3

    而不是(5+3)- (5-3)做好後再乘以(3-5) +(3+5)??

    理解是否正確?

    Thanks

    • 登入以對解答發表意見
還有問題?馬上發問,尋求解答。