C++ 如何使用break语句停止内部和外部循环
我有非常简单的代码,在内部循环中使用C++ 如何使用break语句停止内部和外部循环,c++,objective-c,loops,for-loop,break,C++,Objective C,Loops,For Loop,Break,我有非常简单的代码,在内部循环中使用break: for (int it=0; it<5; it++) { for (int it2=0; it2<5; it2++) { if (it2==2) break; //break here not it2, but it loop NSLog(@"it=%d it2=%d", it, it2); } } 我知道,在一些编程语言中,有可能确定哪一个循环中断语句应该受
break
:
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2)
break; //break here not it2, but it loop
NSLog(@"it=%d it2=%d", it, it2);
}
}
我知道,在一些编程语言中,有可能确定哪一个循环中断语句应该受到影响。是否可以调用
break
停止外部循环(for
使用it
变量) 如果你真的想这么做,那么咬紧牙关,使用goto
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2)
goto end_outer_loop;
NSLog(@"it=%d it2=%d", it, it2);
}
}
end_outer_loop:
// more stuff here.
for(int it=0;it您应该将循环包装在一个函数中,然后使用return
从该函数返回。在使用goto语句编程时,会使程序的逻辑变得复杂和纠结。在现代编程中,goto语句被认为是有害的构造和糟糕的编程实践
您可以将其用作函数,并在条件发生时退出函数
int loop(int it,int it2)
{
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2) return 0; //function returns here
NSLog(@"it=%d it2=%d", it, it2);
}
}
return 1;
}
int循环(int-it,int-it2)
{
对于(int it=0;it,您可以使用bool标志
来达到此目的,如下所示:
bool flag = false;
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2) { flag=true; break; }
NSLog(@"it=%d it2=%d", it, it2);
}
if(flag) {break;}
}
bool标志=false;
对于(int=0;它不幸的是,C++没有这种中断。一种被认为是憎恶的可能性是使用GOTO。
有两种可接受的解决方案:
将此代码放在单独的函数中,并使用return
使用布尔标志
bool stopFlag=false;
对于C/C++中的(int it=0;it),你真的没有这样的东西。显然已经有了一些答案,比如使用goto
或其他什么。就个人而言,我不喜欢goto
以及它们会导致一些草率的代码(IMO)
对我来说,你有两个很好的选择
编写循环条件,使其在两者中都包含退出条件。这是我个人的做法,因为我不喜欢在循环中使用break
或其他东西,除非我绝对必须这样做。我只是认为这有助于清洁产品,这就是我所学到的
如果您确实决定保留中断,那么不要用一行If()
来控制它,而是将它分成两部分,并创建一个“中断标志”,如果满足中断条件,将设置该标志。从这里开始,在外部循环中放置一个附加条件,如果设置了该标志,则退出,或者使用另一个If()
在外循环内(但不在内循环内),如果设置该标志,将断开
希望这能有所帮助。goto
不应该在这里使用。这是一个函数的教科书用例。最好将东西分解成更小的函数。但你不应该这样做只是为了避免goto。这实际上取决于循环是否与计算密切相关。这就是为什么其他语言有特殊的lan这方面的语言特性(循环标签、中断的整数参数等).当人们问我如何合法使用goto
时,这是我唯一可以引用的实际常用的例子。我不知道为什么人们对goto
如此反感,但对switch
完全没问题,因为它的作用域,具有相同的后果。@tenfour正是这个。这和每个人都一样有一天,他们停止了思考,因为他们认为这是少数几个应该使用的案例之一。使用函数就像是为了不使用Goto而强制不同的设计。C或C++,No.Burn只用于当前的循环C。(除了goto
label),但是您可以从第一个循环中断,并设置一个标志来中断第二个循环。对于您的问题,您有两个选项:goto
或一个函数。更有趣的问题是:您的实际问题是什么(您提供的示例看起来很做作),你想用哪种语言来解决它?我在objective-c中遇到了这样的问题,但每次它出现时,我都会找到避免两个for循环的好方法。这是一个典型的由于语言方面的原因而强制设计的案例。这应该是另一种方式。我同意,在某些情况下,这可能是解决问题的方式。很难给出一个明确的答案在不知道OPs实际问题的情况下回答。我认为,对于几乎所有的用例,将迭代封装到一个实现算法的函数中比使用goto
得到更干净的解决方案。一个好的启发是询问您是否能为该函数取一个好名字。这与询问该循环是否执行som是一样的e不同的、可识别的东西。如果存在这样的名称,那么它会使代码自我评论。如果不存在这样的名称,那么内嵌文本将更容易阅读,因为它避免了读者必须穿透额外的间接层。在这种情况下,goto
被认为是完美的。并且不会增加太多的复杂性,因为标签真的很接近跳跃。我同意goto是有用的,但从专业程序员的角度来看,使用goto语句被认为是一个坏习惯。因为这可能会在复杂程序中阅读代码时产生歧义。在简单的程序中是可以的。但是对于他的kNoeLeGe我让他知道使用Goto是一个坏习惯。除了这个例子,它被认为是一个坏习惯。地狱,甚至MISRA C++允许这样。我不知道如何在函数中包装循环更好,它只是减少了我的阅读可读性,并且没有任何好处,因为返回也打破了控制流。作为一名专业程序员,您是否使用异常或switch
语句?所有这些都会在复杂程序中被误用时给其他人阅读代码造成歧义。这总是取决于功能的使用方式,在这个特定的用例中goto
肯定不会被视为坏习惯。在我看来,这是一种可读性较差的习惯nd比使用goto
更清晰。我也有同样的想法,但如果语句不必要。您可以添加条件
bool flag = false;
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2) { flag=true; break; }
NSLog(@"it=%d it2=%d", it, it2);
}
if(flag) {break;}
}