for(i=0;i<number;i++) 循环行为未按预期工作?
Posted
技术标签:
【中文标题】for(i=0;i<number;i++) 循环行为未按预期工作?【英文标题】:for(i=0;i<number;i++) loop behavior not working as expected? 【发布时间】:2013-09-11 01:02:38 【问题描述】:下面的代码应该执行此操作:无论当前运动员在哪里,当您点击下一步按钮时,都会执行下面的代码。它应该将当前运动员更改为数组中的下一个运动员,然后当它到达最后一个人时,它需要循环回 0(第一个对象)。它确实做到了这一点。当我到达数组的末尾时,它会再次转到第一个人,这是正确的,但从那时起将跳过数组中的最后一个对象。知道为什么吗?
-(void)nextAthlete
NSUInteger index = [_athleteArray indexOfObject:_currentAthlete];
Athlete *count = _athleteArray[index];
NSLog(@"Current Athlete:%@ Index: %lu",count,(unsigned long)index);
if(index < ((_athleteArray.count)-1))
index++;
_currentAthlete = _athleteArray[index];
_evalSelected = [self getMostRecentEval];
[self updateInformation];
NSLog(@"Index after being smaller than the array count: %lu",(unsigned long)index);
if(index == ((_athleteArray.count)-1))
_currentAthlete = _athleteArray[index];
_evalSelected = [self getMostRecentEval];
[self updateInformation];
index=0;
_currentAthlete = _athleteArray[index];
NSLog(@"Index after being equal to array count: %lu",(unsigned long)index);
if(index > ((_athleteArray.count)-1))
index=0;
_currentAthlete = _athleteArray[index];
self.title = [NSString stringWithFormat:@"%@'s Evaluation",_evalSelected.whosEval.full];
【问题讨论】:
当您设置index=0
时,您需要在执行其他任何操作之前执行此操作。目前index == _athleteArray.count
时,在更新索引之前访问数组,导致越界访问。
@Mac:我不想要索引为零。它需要从当前运动员所在的位置开始。例如如果我从 5 位中的第 3 位运动员开始,它需要转到 4,然后是 5,然后是 0。
index
是在循环内部还是外部声明?
@CarlVeazey:index 在循环之外
@JosueEspinosa 嗯...在声明 index
的方法中没有循环,因此您的声明与您的代码相矛盾 - 但我想我明白发生了什么。你在做for (int i = 0; i < [_athleteArray count]; i++) [self nextAthlete];
之类的事情吗?
【参考方案1】:
您不需要所有这些if
语句。您将 nextIndex
与模运算符包装在一起,因此您不需要应用所有其他逻辑 - 将 index
设置为 nextIndex
就足够了。此外,由于它们不是 if..else 语句,因此在数组中倒数第二项的情况下,您将多次递增和包装索引。当第二个 if 块执行时,第三个也会执行,所以_currentAthlete
在这种情况下会跳过最后一项。
无论如何,无需重复所有逻辑 - 让您的代码如下所示:
NSUInteger nextIndex = (index + 1) % _athleteArray.count;
Athlete *count = _athleteArray[index];
NSLog(@"Current Athlete:%@ Index: %lu",count,(unsigned long)index);
index=nextIndex;
_currentAthlete = _athleteArray[index];
_evalSelected = [self getMostRecentEval];
[self updateInformation];
self.title = [NSString stringWithFormat:@"%@'s Evaluation",_evalSelected.whosEval.full];
不过,这有点奇怪,因为您跳过了_selectedAthlete
的第一个值。但我想你会在循环的最后一次迭代中回到它。
【讨论】:
是的。谢谢,我没有想到,因为我最初使用的是 index++,所以我只是替换了。谢谢,就像一个魅力! 是的,没问题。在调试器中逐行执行类似这样的操作总是一个好主意,因为您会发现_currentAthlete
的双倍递增,这可能比我通过阅读代码发现的要快得多!【参考方案2】:
从您的评论“如果我从 5 中的第 3 位的运动员开始,它需要转到 4,然后是 5,然后是 0”,听起来您希望前进到下一个索引,将数组视为循环。为此,您可以使用模运算符%
,对于正数,它是余数:
NSUInteger index = [_athleteArray indexOfObject:_currentAthlete];
NSUInteger nextIndex = (index + 1) % _athleteArray.count;
在您的情况下,您有 4 名运动员,因此 index
将在 0 -> 3 的范围内。
因此(index + 1)
在 1 -> 4 的范围内。
除以 4 后取 余数 分别得到 1、2、3、0。
所以nextIndex
是循环方式的“跟随”索引。
【讨论】:
【参考方案3】:if(index < _athleteArray.count)
需要
if(index < _athleteArray.count - 1).
想一想——如果你的数组中有 4 个运动员,那么当 index = 3 时,你将输入 if 子句并将 index 增加到 4。
当你执行
_currentAthlete = _athleteArray[index]
index = 4,你会得到错误。
【讨论】:
您先生,真是个天才。谢谢你,我会在计时结束后接受你的回答。 对不起,它不再崩溃了,但它仍然不会超过最后一个人,当我点击下一个时它只是停留。我用额外的 count-1 更改了所有 if 语句。知道为什么会这样吗? @JosueEspinosa,在显示最后一个运动员后,您希望它做什么?拿到第一个了吗? 应该做到以下几点:0,1,2[继续加1],lastObject,0,1,2,....,lastObject...以上是关于for(i=0;i<number;i++) 循环行为未按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章