C_and_CPP 板


LINE

※ 引述《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
1F:→ twotwoone:http://msdn.microsoft.com/library/teas0593.aspx 11/15 19:39
2F:推 tylpk:感謝..果然是高手...非常的謝謝你 11/15 20:18
3F:→ twotwoone:突然想到以前看過的遞增運算 x = -~-~x; 即 x = x + 2; 11/16 13:04
4F:推 VictorTom:天啊~~221大推的這行code好噁心....XD 11/16 13:07
5F:→ twotwoone:像精蟲 11/16 13:14
6F:推 VictorTom:要有口卡口卡獸的風格: 這code~~有蟲....Orz 這樣XD 11/16 13:30
7F:→ weiyucsie:三樓那個應該要在二補數系統才成立吧? 11/16 13:36
8F:→ twotwoone:是啊,要二的補數。因為 -- 讓我想到這個 11/16 13:41
9F:→ twotwoone:x = 1 * - - x; 會跟 x = 1 * --x; 得到不一樣運算 11/16 13:42







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP