[問題] 使用巨集結果不如預期(已解決)

看板C_and_CPP (C/C++)作者 (冥王星貓)時間15年前 (2011/04/18 17:48), 編輯推噓1(1017)
留言18則, 7人參與, 最新討論串1/1
請問一下 我在windows下用TC編譯以下的程式碼 #include<stdio.h> #define MAX(a,b) (a<b?b:a) #define PRINT1(x) printf("%d",x) #define PRINT3(x, y, z) PRINT1(x),PRINT1(y),PRINT1(z) void main() { int m1=1, m2=3; PRINT3(MAX(m1++,--m2),m1,m2); } 輸出的結果為什麼是121不是222 我要把MAX改成副程式如下 int MAX(int a, int b) { return (a<b?b:a); } 才能得到222 --更新線-- 謝謝大家的解惑 我一開始就搞錯方向思考 怪不得解不出結果 每次用注解回都回很長 這次就修改文章了 等下會改標題 <(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.66.180.205

04/18 17:57, , 1F
巨集展開是直接取代程式碼, 置底十三誡有例子
04/18 17:57, 1F

04/18 17:58, , 2F
MAX(m1++,--m2) 會變成 (m1++<--m2?--m2:m1++) 答案顯然不對
04/18 17:58, 2F

04/18 17:59, , 3F
我只想說:無論如何都不要這樣用 #define
04/18 17:59, 3F

04/18 18:10, , 4F
這是看到的練習題, 我很直覺得用函式方法思考了
04/18 18:10, 4F

04/18 18:11, , 5F
所以看到答案不對還很錯愕= =
04/18 18:11, 5F

04/18 19:40, , 6F
濫用逗號是很危險的事...
04/18 19:40, 6F

04/18 20:30, , 7F
建議標題改為「使用巨集結果不如預期」
04/18 20:30, 7F
有 標題已改

04/18 20:42, , 8F
使用巨集時,請勿傳入有副作用的參數
04/18 20:42, 8F
只能說他題目設計這樣 我照著打卻沒找對重點

04/18 21:56, , 9F
我是在練習題上看到這個題目 正確答案是121卻想不出理由
04/18 21:56, 9F

04/18 21:57, , 10F
實際compile完也找不出問題點(我在想到的檢查點都做輸出)
04/18 21:57, 10F

04/18 21:58, , 11F
所以跑來這邊求助 現在看好像笨板文一樣= =
04/18 21:58, 11F

04/18 22:02, , 12F
樓上知道什麼是前處理嗎? 看看TC有沒有辦法輸出前處理
04/18 22:02, 12F

04/18 22:03, , 13F
後的檔, #define 就是前處理器的指令, 如一樓所說,
04/18 22:03, 13F

04/18 22:03, , 14F
看代換出來的程式碼, 你就能了解原因了
04/18 22:03, 14F

04/18 22:06, , 15F
這跟編譯沒關係...
04/18 22:06, 15F
是啊 看到ledia的說明瞬間就知道自己笨在哪了= =a

04/18 22:11, , 16F
十三誡之九...
04/18 22:11, 16F
恩? 不是之八嗎 ※ 編輯: licanja 來自: 61.66.180.205 (04/19 00:19)

04/19 00:30, , 17F
感覺是十三誡之九沒錯,第二頁有類似的例子
04/19 00:30, 17F

04/19 00:30, , 18F
9才有談到define
04/19 00:30, 18F
文章代碼(AID): #1Dh0a8XL (C_and_CPP)
文章代碼(AID): #1Dh0a8XL (C_and_CPP)