为什么假设循环的Objective C表现为C for循环是不安全的?

ste*_*hen 1 loops objective-c ios

我有一个属性,我称之为索引.我有一个可变数组,我将其称为数组.我很震惊地发现这段代码抛出索引超出范围的异常?

if(index >= [array count]) return;


for(self.item = [array objectAtIndex:index]; index < [array count]; self.item = [array objectAtIndex:index]) {
        index++;
        //do stuffs
    }
Run Code Online (Sandbox Code Playgroud)

但是,此变体有效:

if(index >= [array count]) return;
while(index < [array count];) {
    self.item = [array objectAtIndex:index];
    index++;
    //do stuffs
}
Run Code Online (Sandbox Code Playgroud)

我希望循环操作如下:

for(initialization instructions; condition; next iteration instruction) {...}
Run Code Online (Sandbox Code Playgroud)

我期待以下顺序:

  1. 执行初始化指令
  2. 在for循环中执行代码
  3. 如果条件返回false/0则中断.否则,执行下一个迭代指令.然后转到2.

这告诉我for循环不一定在执行下一个迭代代码之前检查条件(如在C/C++中).所以,我很好奇是否有关于for循环操作顺序的多种思想流派.如果没有,这告诉我有更复杂的问题需要解决.

谢谢.

nvu*_*ono 6

你是否index在第一种情况下在for循环内递增?

for(self.item = [array objectAtIndex:index]; index < [array count]; self.item = [array objectAtIndex:index]) { 
    //do stuffs 
    index++;
} 
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,那么你的语法会在你设置的for循环的第三部分搞砸了,self.item = [array objectAtIndex:index]而这正是抛出异常的地方,因为这部分在比较发生之前被执行index < [array count]并且让你退出循环.

你为什么不直接定义你的for循环?

for(self.item = [array objectAtIndex:index]; index < [array count]; index++) { 
        //do stuffs 
    } 
Run Code Online (Sandbox Code Playgroud)

第一次通过你将首先检查CONDITION,但随后增量器在循环的每次迭代结束时运行.那时它变为INCREMENTER - > CONDITION - > loop_body.

它相当于以下内容:

initialize; 
while(condition) { 
    // do stuffs
    index++;
    LOOP_INCREMENTER; // this is your assignment statement, self.item = [array objectAtIndex:index]; 
} 
Run Code Online (Sandbox Code Playgroud)