今天犯了一個蠻笨的錯誤
我在做一個功能的測試程式,透過rand( )亂數產生一些數值,數值必需介於5~100之間,於是我很天才的這樣寫:
a = max(5,rand()%100);
結果a有可能會低於5,這不是靈異現象,也不是compiler出了問題,是我誤會了max。max在VS2008中並非函式,而僅是一個巨集,定義在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的運算