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灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP