2011年1月19日 星期三

max不一定真的是max


今天犯了一個蠻笨的錯誤

我在做一個功能的測試程式,透過rand( )亂數產生一些數值,數值必需介於5100之間,於是我很天才的這樣寫:

a = max(5,rand()%100);

結果a有可能會低於5,這不是靈異現象,也不是compiler出了問題,是我誤會了maxmaxVS2008中並非函式,而僅是一個巨集,定義在WinDef.h

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

看出問題了嗎,如果把巨集展開

a = (((5) > (rand()%100)) ? (5) : (rand()%100));

rand()在過程中呼叫了2次,使用max(或min)要小心,勿使用到會改變自身狀態的函式或物件。

這個例子比較好的寫法是    a = 5 + (rand() % 95); 省去了max的運算