3

这有效:

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。

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

4

1 回答 1

4

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

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

解决这个问题的最佳方法是移动-4到表达式的另一端,将符号更改为 a +,如下所示:

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

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

于 2013-06-12T17:26:12.113 回答