Re: [問題] 關於#define的問題

看板C_and_CPP (C/C++)作者 (累...)時間15年前 (2010/10/10 20:06), 編輯推噓3(3015)
留言18則, 3人參與, 最新討論串2/2 (看更多)
試了一下: #include <stdio.h> #define INC_1(z) (++z) #define INC_2(z) ++z #define SUM_1(a,b) (a+b) #define SUM_2(a,b) a+b void main(){ int x = 1, y = 5; printf("%d\n", x+INC_1(y)); x = 1, y = 5; printf("%d\n", x+INC_2(y)); printf("%d\n", SUM_1(1,5)*5); printf("%d\n", SUM_2(1,5)*5); } 結果是 7 7 30 26 前兩者是否有加括號,結果都是一樣的,而後兩者則有受影響 請問要如何區別呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.113.163.191

10/10 20:09, , 1F
第三第四個你代換一下就知道了, 加法+的優先權比前加
10/10 20:09, 1F

10/10 20:10, , 2F
++還要低, 就算你不加括號跟他講, 他還是先算++
10/10 20:10, 2F

10/10 20:11, , 3F
http://nopaste.csie.org/3750f <= 你的程式相當這樣
10/10 20:11, 3F
※ 編輯: oberstei 來自: 59.113.163.191 (10/10 20:25) 請問SUM_2沒加括號,結果是1+5*5 那為何INC_2不加括號不會替換成x+++y=(x++)+y 而會先判斷++y? 還是像上面前輩的程式,沒括號也會自動附加一個空格呢? ※ 編輯: oberstei 來自: 59.113.163.191 (10/10 20:44) ※ 編輯: oberstei 來自: 59.113.163.191 (10/10 20:45)

10/10 20:51, , 4F
因為優先權是前置++ > 二元 + > 後置++
10/10 20:51, 4F

10/10 20:54, , 5F
奇怪我跟樓上怎麼看的不一樣@@
10/10 20:54, 5F

10/10 20:57, , 6F
糟糕 我搞錯了嗎 XD (對於這種 +++ 的東西實在很不行)
10/10 20:57, 6F

10/10 20:58, , 7F
應該是 前置++ > 後置++ > 二元 + 才對 (真不好意思)
10/10 20:58, 7F

10/10 20:58, , 8F
因此 x+++y 一定會先結合出 ++y 而不會是 x++
10/10 20:58, 8F

10/10 21:08, , 9F
我看的是後置>前置>二元 Orz...我用g++ -E 取得檔案
10/10 21:08, 9F

10/10 21:09, , 10F
前處理後的結果, 為了怕他加空白, 我有改了一點, 原始
10/10 21:09, 10F

10/10 21:14, , 11F
程式碼 : http://ppt.cc/l(uT , 前處理過的程式碼 :
10/10 21:14, 11F

10/10 21:15, , 12F
http://ppt.cc/L1Al 他會幫你加括號...
10/10 21:15, 12F

10/10 21:15, , 13F
更正! 是空白 @@
10/10 21:15, 13F

10/10 21:19, , 14F
如果是我寧願犧牲一點執行時間也不要被巨集玩...
10/10 21:19, 14F

10/10 21:19, , 15F
我在三樓貼的也是用 gcc -E 生出來的 XD
10/10 21:19, 15F

10/10 21:21, , 16F
難怪~ 我就覺得怎麼會多一個空白, 加的地方有點特殊
10/10 21:21, 16F

10/11 16:10, , 17F
所以是編譯器處理時把INC_2多加了一個空白嗎?
10/11 16:10, 17F

10/11 16:10, , 18F
這樣還真的不知道要如何判斷@@
10/11 16:10, 18F
文章代碼(AID): #1CiQnKcA (C_and_CPP)
文章代碼(AID): #1CiQnKcA (C_and_CPP)