2012-08-29 53 views
1

這裏有幾行代碼... currentPage是一個NSInteger,imageViewHolder是一個NSMutableArray。有條件顯示錯誤...爲什麼它是真的?

NSLog(@"currentPage: %d, imageViewHolderCount: %d", currentPage, [imageViewHolder count]); 
    if(currentPage < [imageViewHolder count] - 1)  
    { 
     NSLog(@"%d < %d - 1", currentPage, [imageViewHolder count]); 
     tempView = [imageViewHolder objectAtIndex:currentPage + 1]; 
     NSLog(@"doesn't get here, crashed."); //this doesn't get logged because of crash. 

     //do other stuff here 
    } 

由於索引超出界限,我崩潰在「tempView = ...」行。這是我得到的輸出:

currentPage: 0, imageViewHolderCount: 0 
0 < 0 - 1 
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array' 
*** First throw call stack: 
(0x339bd88f 0x324af259 0x339069db 0x48f1b 0x48c1b 0x35603a85 0x35603409 0x35602c57 0x35716b0f 0x3560424d 0x4abfb 0x324ab175 0x43f77 0x45b91 0x479a7 0x36bff 0x285ed 0x35604ecb 0x32935933 0x33991a33 0x33991699 0x3399026f 0x339134a5 0x3391336d 0x32e91439 0x35608e7d 0xfa01 0xf9c0) 

我敢肯定我錯過了一些明顯的東西......爲什麼我的if語句被評估爲真?我相當肯定,0實際上比-1 :)

+3

數組的計數是無符號的。如果你打印'([imageViewHolder count] - 1)'?會發生什麼? –

回答

5

問題是count無符號類型。當你從一個無符號零減去1時,最終會得到一個非常大的正數,而不是-1

替換與使用另外的等效表達式的條件,以避免該問題:

if((currentPage+1) < [imageViewHolder count]) ... 


-1在大多數現代計算機用於表示底片 2-s complement表示形式的值是二進制數完全由一個組成。當這個數字被重新解釋爲一個無符號的32位值時,它變成了 2^32-1

+0

噢!太好了,謝謝。如此簡單,現在你已經指出了它......當使用無符號整數時,我將不得不小心。 – MikeS

0

這是一個長鏡頭,更大的......但嘗試寫你的條件是這樣的:

(currentPage < ([imageViewHolder count] - 1)) 

也許問題是,編譯器被分組像這樣

((currentPage < [imageViewHolder count]) - 1) 

(0 < 0)返回假(0),然後substracts 1,以及保持在-1,這是不同於0,所以它返回真

2

是的,但是0遠小於MAX_INT。你正在處理無符號整數(我不得不仔細檢查標準是否定義爲MAX_INT,或者未定義的行爲恰好是MAX_INT,但在任何情況下它都不是你的意思)。我懷疑如果你看看你的編譯器輸出,這個效果有一個警告(永遠不允許ObjC代碼中的任何警告)。

另請參見unsigned long 0 < -1?

+0

謝謝。然而,沒有編譯器警告。儘管如此,請閱讀其他主題。 – MikeS

相關問題