Re: [問題] 前置處理器取代問題 --

看板C_and_CPP (C/C++)作者 (我不配)時間16年前 (2009/11/15 19:34), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《tylpk (tylpk)》之銘言: : ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) : ( 未必需要依照此格式,文章條理清楚即可 ) : 遇到的問題: (題意請描述清楚) : 有一個程式如下 : #define FF(x) -x : int main(void) : { : int x = 1, y = 4; : printf("%d\n", -FF(x+y)); : return 0; : } : 我原本以為前置處理器取代後會變成 : --x+y (所以答案應該會是4) : 但我用 Dev-Cpp 跑出來答案卻是 5 : 我如果直接打 printf("%d\n", --x+y) 答案也是 4 : 百思不解下切到 DOS 模式,直接下 gcc -E : 看到的取代結果居然是 - -x+y (兩個減號中間有空格) : 而 printf("%d", - -x+y) 答案果然是 5 : 我有點搞不清楚了,誰可以告訴我為什麼嗎? define 的原則不熟,很少用,隨便猜猜。 我猜他會把 FF() 括弧內的東西當作一個 token 當作一個運算元 所以你放 FF(x) 就變 -x 你放 FF(x+y) 就變 -x+y 因為他不認識 + 號,只是單純 把 x 跟 x+y 都當作 token 而已,所以取代後的結果就是 token 的第一個字母前面 加上一個負號變成 -x+y。 然後 define 本來就是取代 token 用的,你卻加上 - (unary minus) 於 FF() 前 為了避免變成另一個運算子 -- 這類情況,所以一律加上空格,使得 FF() 不會跟前面 的東西合併在一起。 == - -x+y 這個運算式就是很明顯 + 是二元運算子,要把左右兩個值相加,右邊沒問題 左邊的 x 被加上 unary minus 這個運算子,根據標準的定義,他運算優先權就是比 相加高啊,所以必須先變成負數 -x 得 -1 然後 -1 再做一次 unary minus 就變 +1 得到 1 + 4 = 5,算完。 不會是 --x 因為「-」跟「-」之間只要有空格就不會當成同一個 token 會變成兩個 tokens 所以是對 x 做兩次 unary minus 運算。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.162.46

11/15 20:18, , 2F
感謝..果然是高手...非常的謝謝你
11/15 20:18, 2F

11/16 13:04, , 3F
突然想到以前看過的遞增運算 x = -~-~x; 即 x = x + 2;
11/16 13:04, 3F

11/16 13:07, , 4F
天啊~~221大推的這行code好噁心....XD
11/16 13:07, 4F

11/16 13:14, , 5F
像精蟲
11/16 13:14, 5F

11/16 13:30, , 6F
要有口卡口卡獸的風格: 這code~~有蟲....Orz 這樣XD
11/16 13:30, 6F

11/16 13:36, , 7F
三樓那個應該要在二補數系統才成立吧?
11/16 13:36, 7F

11/16 13:41, , 8F
是啊,要二的補數。因為 -- 讓我想到這個
11/16 13:41, 8F

11/16 13:42, , 9F
x = 1 * - - x; 會跟 x = 1 * --x; 得到不一樣運算
11/16 13:42, 9F
文章代碼(AID): #1A_-TLkD (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1A_-TLkD (C_and_CPP)