[問題] 關於#define的問題

看板C_and_CPP作者 (累...)時間13年前 (2010/10/10 17:29), 編輯推噓4(407)
留言11則, 5人參與, 最新討論串1/2 (看更多)
C語言程式如下: #include <stdio.h> #define INC(z) (++z) void main(){ int x = 1, y = 5; printf("%d\n", x+INC(y)); x = 1, y = 5; printf("%d\n", x+++y); x = 1, y = 5; printf("%d\n", x+ ++y); } 程式執行(CodeBlocks)的結果是: 7 6 7 想請問幾個問題: 1. define不是等同於字串代換嗎?為什麼第一個輸出是7,而第二個輸出是6呢? 2. 自己以為define應該沒有自帶空白的效果,但是第一個輸出和第三個輸出結果相同 在C語言中printf中的空白會造成影響嗎? 請各位指教,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.113.163.191

10/10 17:35, , 1F
第二個 printf 結果不同應該是 x+++y 被解讀成 (x++)+y 了
10/10 17:35, 1F

10/10 17:40, , 2F
他是想問為何第一個會被當作x+(++y)吧
10/10 17:40, 2F

10/10 17:41, , 3F
他不是define的地方自己有用( )刮起來嗎 @@
10/10 17:41, 3F

10/10 17:55, , 4F
查一下運算子的優先權就知道了, Suffix ++ 比 Prefix
10/10 17:55, 4F

10/10 17:56, , 5F
來得高, 會先結合, 跟你用空白分開的情況當然不同
10/10 17:56, 5F

10/10 17:58, , 6F
在你巨集裡的括號也是用來覆寫運算子優先權, 因為跟第
10/10 17:58, 6F

10/10 17:58, , 7F
三個他自己就先結合的運算順序是一樣的, 所以結果相同
10/10 17:58, 7F

10/10 19:08, , 8F
非常感謝回答!另外想請問空白的優先權算是最大嗎?
10/10 19:08, 8F

10/10 19:08, , 9F
因為在運算子優先權表格查不到空白(應該也不算運算子...)
10/10 19:08, 9F

10/10 19:11, , 10F
空白只是幫你分開程式碼, 在這個例子是用來分成不同
10/10 19:11, 10F

10/10 19:11, , 11F
部分告訴編譯器你想怎麼結合
10/10 19:11, 11F
文章代碼(AID): #1CiOTX50 (C_and_CPP)
文章代碼(AID): #1CiOTX50 (C_and_CPP)