2013-12-12 157 views
1

我指的是this question副作用

#define max(a,b) ((a<b)?b:a)

这将有一定的副作用,如回答说;

如果使用最大值(A +,B ++),例如(A或B 将递增两次)

我无法理解这种副作用的副作用出现;当我们使用max(a ++,b ++)时,为什么a或b会增加两次?

+0

请记住,宏实际上是文本替换。展开宏,你应该看到问题。 –

+0

@FredLarson你的建议的确对我有帮助。谢谢 – user25108

+0

另请阅读[Sequence point](http://en.wikipedia.org/wiki/Sequence_point) –

回答

7

如果你在这样的代码使用max(a++,b++)

x = max(a++,b++); 

文本替换发生,因为

x = ((a++<b++)? b++ : a++); 
    ^^ ^---------Increment if condition is true 
     |---|---------Increment 

所以,你会被递增或者ab两次......

+1

没有括号包围'a ++'和'b ++'。 – timrau

+0

文本替换实际上是'x =((a ++

+0

@timrau雅试图编辑文本,但浏览器被卡住了。对不起,这个错误... – 2013-12-12 06:08:00

1

max(a++, b++)将被扩展为((a++ < b++) ? b++ : a++)。从左侧开始评估时,表达式(a++ < b++)优先,并将增加ab。这是第一个增量。然后根据<运算符的输出,ab将再次递增(这是第二个增量)。