2013-06-12 31 views
3

這工作:爲什麼m_array.count在for循環中作爲條件使用時失敗?

int i, start, end; 

start = m_cardArr.count - 1; 
end = m_cardArr.count - 4; 
NSLog(@"%i %i", m_cardArr.count - 1, m_cardArr.count - 4); 
for(i = start; i > end; i--) 
{ 
    LabyrinthCard* labyCard = (LabyrinthCard*)[m_cardArr objectAtIndex:i]; 
    if(labyCard.m_type != cardType || labyCard.m_usedForDoor) 
    { 
     return false; 
    } 
} 

這不進入for循環都:

int i; 

NSLog(@"%i %i", m_cardArr.count - 1, m_cardArr.count - 4); 
for(i = m_cardArr.count - 1; i > m_cardArr.count - 4; i--) 
{ 
    LabyrinthCard* labyCard = (LabyrinthCard*)[m_cardArr objectAtIndex:i]; 
    if(labyCard.m_type != cardType || labyCard.m_usedForDoor) 
    { 
     return false; 
    } 
} 

我不改變內部的數組的大小,因此,使用m_cardArr.count作爲條件應工作。在這兩種情況下,當數組中有3個元素時,NSLog打印2,-1。

我找不到我在這裏失蹤的東西。

+0

我對此很難搜索,認爲它已經被回答。對不起,我沒有找到它。 – Almo

回答

4

這是因爲count屬性的類型爲NSUInteger,即無符號數。當您從中減去4並且結果變爲負數時,它會被解釋爲非常大的正數。

當您將該結果分配給int時,您將再次將其解釋爲負數,以解決問題。

尋址這將被移動-4到表達式的另一側,改變符號到+,像這樣的,最好的方法:

for(i = m_cardArr.count - 1; i+4 > m_cardArr.count; i--) { 
    ... 
} 

表達背後的邏輯將保持不變,但您將不會再看到由減法引起的有符號/無符號副作用。

+0

哇......我以爲這是奇怪的東西。謝謝! – Almo

相關問題