2013-06-12 83 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

相关问题