在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;
我在这里遗漏了什么,或者第二个例子是编译器错误?
答案 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条件被认为是声明后的一行,你在下一行中找到的不再属于循环/条件。否则使用括号实际上定义为迭代中的行。 希望这会有所帮助。