2013-12-12 76 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將再次遞增(這是第二個增量)。