0);"> (CurIndex<0)
CurIndex = max(0, Vector.size()-1); // 這裡使用max宏
}
按預期,當Vector為空時,CurIndex的值應該為0。然而實際結果是CurIndex仍然為-1。單步調試,的確執行了相應的語句,但CurIndex的就是不變的-1,重新編譯也沒用。這是不是很奇怪呢?
如果Vector.size()-1的結果小於0,那麼max(0, Vector.size()-1)的結果就應該是0;
如果Vector.size()-1的結果比0大,那麼max(0, Vector.size()-1)的結果就應該是個正整數才對。
然而實際結果確是-1。0減1比0大,並且等於-1?多麼矛盾呀!
如果您看了下面的語句,也許就矛塞頓開了:
int CurIndex = max( 0, (unsigned int)0-1);
您認為CurIndex應該等於幾呢?
當0減去1的時候,它的結果化為16進制,應該為0x ff ff ff ff(假設為4字節)。作為有符號整數,它的值為-1。而做為無符號整數,它的值為4294967295(使用Windows自帶的計算器算的)。
按C++的隱式類型轉換規則:程序在執行算術運算時,低類型向高類型轉換。這時(unsigned int)0-1的值為4294967295。顯然這個值比0大,所以max( 0, (unsigned int)0-1)的計算結果應該為4294967295,即0x ff ff ff ff,類型為無符號整型(unsigned int)。
當把這個結果賦值給CurIndex時,CurIndex是int型的,使用另一條C++的隱式類型轉換規則:在賦值表達式中,右邊表達式的值自動隱式轉換為左邊變量的類型,並賦值給它。0x ff ff ff ff當做整型賦值,結果就是-1。所以CurIndex的值為-1,16進制仍然是0x ff ff ff ff。
vect類的size()函數返回值就是無符號型的,所以CurIndex = max(0, Vector.size()-1)的值可能為-1就不奇怪了。
所以0減1等於幾,還得看是什麼類型的0,以及什麼類型的1。
0-1 == -1;
(unsigned int)0-1 == 4294967295;
Bug一不小心就跑出來,借用范廚師的話:真是防不勝防呀!
作者:蘇林