Xcode“无限循环”不一致

时间:2010-02-06 00:40:19

标签: objective-c xcode for-loop

在iPhone模拟器中的调试下运行此代码时,在循环5次迭代后,r == 4正确退出: -

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

没有括号,它在1次迭代后以r == 1退出: -

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

没有大括号,但是测试表达式为true,代替缺少测试表达式的永久正确默认值,它在循环5次迭代后正确退出r == 4: -

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

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

4 个答案:

答案 0 :(得分:2)

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

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

for (r = 0;r++;)

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

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

如果我再次按下“跳过”,它会回到循环中;只是一点点图形打嗝。

答案 1 :(得分: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中尝试的代码,它基本上与上面描述的行为相同(我刚刚在一个新的Cocoa应用程序项目中添加了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);
}

图片与Cocoa应用程序:

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

所以问题是,你是否真的一步一步地点击循环并且循环在一次迭代后真的退出,或者你刚刚在一次迭代后停止了?

答案 2 :(得分:0)

对我来说看起来像编译器错误。您设置了什么编译器,gcc或llvm-gcc?

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

答案 3 :(得分:0)

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