作者twotwoone (我不配)
看板C_and_CPP
标题Re: [问题] 前置处理器取代问题 --
时间Sun Nov 15 19:34:42 2009
※ 引述《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
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