函 数 式
警觉
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f25.png?t=20140803)
我大FP赛高!Haskell天下第一!
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f25.png?t=20140803)
感谢楼上给我的启发
![](http://tb2.bdstatic.com/tb/editor/images/face/i_f25.png?t=20140803)
——————————————
正经回答
楼上说的很清楚了,宏是直接替换,不看当前语境的
我再举个例子:
你这个宏要实现的应该是abs(x-y)的作用
2+abs(1-0)是多少?是3。
abs(1-0)+2是多少?也是3。
所以说,你要实现的是这样的效果:2+diff(1,0)==diff(1,0)+2==3
如果你不加括号,2+diff(1,0)和diff(1,0)+2展开后分别是这样的:
2+(1)>(0)?((1)-(0)):((0)-(1))
(1)>(0)?((1)-(0)):((0)-(1))+2
再进一步简化一下的话:
第一个是2+1>0?1:-1,第二个是1>0?1:1。
第一个没毛病,结果是3;但是第二个就出问题了,结果是1。
如果加了括号呢?
2+((1)>(0)?((1)-(0)):((0)-(1)))和((1)>(0)?((1)-(0)):((0)-(1)))+2
括号里的内容永远是先算的,所以结果没有问题,都是3。
(PS.实际上如果x<y的话其实不加括号也能输出正确结果的。。)