2014-07-01 43 views
0

我有一個if語句,用於檢查一個指數是否小於數組的末尾。 當「i」的值爲-1時,這不起作用。如果語句檢查NSArray大小

NSMutableArray *myArray = [NSMutableArray array]; 
[myArray addObject:@"coucou"]; 

int i = -1; 

// Not working 
if (i < ([myArray count] - 1)){ 
    NSLog(@" first ok "); 
} 

// Fix 
int count = [myArray count] - 1; 
if (i < count){ 
    NSLog(@" second ok "); 
} 

這就是我需要做的就是它的工作(相同的算法,但使用一箇中間變量來存儲數組的大小) 任何人都知道爲什麼嗎?

+3

因爲[myArray count]返回NSUInteger,並且您將它與int變量進行比較。 use(int)[myArray count]。它會正常工作。 – Yogendra

+0

非常感謝@trojanfoe非常有趣的評論.. – Hacketo

回答

3

[myArray count]回報NSUInteger這是一個無符號整數無論是。

將無符號整數與有符號整數進行比較時,有符號整數將轉換爲無符號整數,因此i值現在不爲負。

查看here瞭解更多信息。

+0

是更接近事實。你應該強調,通過「非負面」,你在這種轉換過程中實際上會「非常大」。 – trojanfoe

+0

@trojanfoe是對的。 – KudoCC

+0

無符號值是有符號值的2的補碼。這就是爲什麼負值會導致非常大/小的數字,如:(2^32 - abs(你的數字))。位的數量取決於機器結構。如果你的整數攜帶4個字節,那麼它的32位等等 –

0

你正在比較一個有符號的整數與int這就是爲什麼它正在發生使用NSUInteger而不是int。 這肯定會工作

+0

你能解釋*爲什麼*它不工作? – trojanfoe

+1

,因爲當你寫'if(i <([myArray count] - 1)){NSLog(@「first ok」); }'([myArray count] - 1)給出你和無符號整數,你將它與int使用表達式[myArray count] -1進行比較來調試你將得到你的答案 –

0

[myArray count]返回unsigned long類型值,你需要保持的這兩個

((NSInteger)[myArray count] - 1) OR ((int)[myArray count] - 1)