2010-02-06 37 views
2

当运行下在iPhone模拟器调试这个代码,它正确地随r == 4后循环的5次迭代退出: -Xcode的“无限循环”不一致

int r; 
for (r = 0;;r++) 
{ 
    if (r == 4) 
     break; 
} 

没有大括号,它与离开ř== 1之后1次迭代: -

int r; 
for (r = 0;;r++) 
    if (r == 4) 
     break; 

没有大括号,但与测试表达式,其为真,代替永久真默认为一个丢失测试表达式的,它正确地随r == 4退出经过5次迭代后: -

int r; 
for (r = 0; r > -100;r++) 
    if (r == 4) 
     break; 

我在这里丢失了什么,或者是第二个例子是一个编译器错误?

回答

2

我没有模拟器,但如果真的发生了什么事情,那么是的,出现了问题。就语言而言,你的第一个和第二个例子是相同的。你确定你的测试是准确的吗?你上面给我们展示的代码正是你在模拟器中运行的代码?

编辑:好的我试过了,它在模拟器中正常工作。我最好的解决你的问题的猜测是,你有:

for (r = 0;r++;) 

意外的情况下,你认为是失败的。请注意,空循环语句是从您上面写的内容中移出的。这个for循环会给你1的结果。

编辑2:在阅读了一些其他的答案后,我想我应该检查出调试器。看看这个截图! image http://img38.imageshack.us/img38/7128/xcodeh.png

如果我再次按下“step over”,它会重新回到循环中;只是一个小小的图形呃逆。

+0

“for”中的三个分号会产生编译时语法错误。 – 2010-02-06 01:18:22

+0

糟糕!编辑时间。谢谢,做了我自己的错字。 – 2010-02-06 01:20:37

+1

+1提供了我试图描述的屏幕截图:) – 2010-02-06 01:40:29

0

对我来说看起来像一个编译器错误。你有什么编译器,gcc或llvm-gcc?

我刚刚用gcc 4.2.1(Apple Inc. build 5646)进行了测试,并在两种情况下都得到了正确的结果。

2

我不知道你的问题应该被认为是重复的,但也许这就是答案:

Are loops with and without parenthesis handled differently in C?

调试器在同一时间执行一个声明

我在以前的回答中有点误。当然,调试器也执行循环4次。不同的是,它看起来像像他一次迭代后退出。当调试以下代码:

#include <stdio.h> 

int main (int argc, const char * argv[]) { 
    int r; 
    for (r = 0;;r++) 
     if (r == 4) 
      break; 

    printf("%i",r); 
    return 0; 
} 

调试器再次处理for线,那么if线,该for行,然后凸显printf线。所以看起来好像要执行printf,但在下一步中,调试器再次突出显示if行,然后转至for,从而增加r,然后再次突出显示printf

这是我在Xcode尝试了代码,它基本上是上述(I只是在新鲜可可应用项目添加一些代码行中main.m)所描述的相同的行为:

#import <Cocoa/Cocoa.h> 

int main(int argc, char *argv[]) 
{ 
    int r; 
    for (r = 0;;r++) 
     if (r == 4) 
      break; 
    return NSApplicationMain(argc, (const char **) argv); 
} 

图片与可可应用:

Debugger http://img691.imageshack.us/img691/3844/1002060002.png

所以现在的问题是,你有没有真正通过循环步步点击,是一个迭代后的循环真正退出,或之后你刚刚停止一次迭代?

+0

我不认为这是同一个问题;你链接到的问题是关于调试器步进;整个循环的执行没有语义上的差异。 – 2010-02-06 01:10:36

+0

@Carl Norum:我现在不知道你的意思是什么*语义差异*,但OP也提到*调试*他的代码。所以我很肯定至少答案可以在这里适用。 – 2010-02-06 01:15:48

+0

我要去尝试一下;但任何改变程序控制流的调试器都是坏消息。 – 2010-02-06 01:20:21

0

这不是一个错误。这基本上就是C语法。没有括号for/while循环或if条件被认为只有一行后声明,你在下一行找到不属于循环/条件了。否则,将括号实际上定义为行,就像你在迭代中所做的那样。 希望这有助于。