为什么m_array.count在for循环中用作条件时会失败?

时间:2013-06-12 17:19:29

标签: objective-c

这有效:

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。

我无法弄清楚我在这里缺少什么。

1 个答案:

答案 0 :(得分:4)

这是因为count属性的类型为NSUInteger,即无符号数。当你从中减去4并且结果变为负数时,它会被解释为一个非常大的正数。

当您将结果分配给int时,您会再次将其重新解释为否定,从而解决问题。

解决此问题的最佳方法是将-4移至表达式的另一侧,将符号更改为+,如下所示:

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

表达式背后的逻辑将保持不变,但您不会再看到由减法引起的有符号/无符号副作用。