这有效:
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 :(得分:4)
这是因为count
属性的类型为NSUInteger
,即无符号数。当你从中减去4
并且结果变为负数时,它会被解释为一个非常大的正数。
当您将结果分配给int
时,您会再次将其重新解释为否定,从而解决问题。
解决此问题的最佳方法是将-4
移至表达式的另一侧,将符号更改为+
,如下所示:
for(i = m_cardArr.count - 1; i+4 > m_cardArr.count; i--) {
...
}
表达式背后的逻辑将保持不变,但您不会再看到由减法引起的有符号/无符号副作用。