我有两个这样嵌套的for循环:
for(...) {
for(...) {
}
}
我知道有一个break
声明。但我很困惑,如果它打破了两个循环或只是它被调用的那个?一旦我发现迭代次数没有意义,我就需要打破这两个。
答案 0 :(得分:106)
如果使用goto简化代码,那么它是合适的。
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
答案 1 :(得分:91)
中断一个循环,但你可以在外循环中添加一个检查,当内部中断时它会中断。
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
答案 2 :(得分:13)
break
语句只能让你离开最里面的循环。如果您不希望在代码,内存和专用状态变量的性能方面增加额外开销,我建议将代码重构为自己的函数或方法,并使用return
退出所有循环:
void do_lots_of_work(void)
{
int i, j;
for(i=0; i<10 ; i++)
{
for(j=0;j< 10; j++)
{
..
..
if(disaster_struck())
return; /* Gets us out of the loops, and the function too. */
}
}
}
答案 3 :(得分:9)
除了已经提到的标志变量或goto之外,你可以throw一个Objective-C例外:
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
答案 4 :(得分:7)
其他人已经提到了如何设置标记或使用goto
,但我建议重构代码,以便将内部循环转换为单独的方法。然后该方法可以返回一些标志以指示外部循环应该break
。如果你恰当地命名你的方法,那就更具可读性了。
for (int i = 0; i < 10; i++) {
if (timeToStop(i)) break;
}
-(bool) timeToStop: (int) i {
for (int j = 0; j < 10; j++) {
if (somethingBadHappens) return true;
}
return false;
}
伪代码,未经测试,但你明白了。
答案 5 :(得分:2)
break语句只会跳出作用域的循环,即父循环。如果你想要突破第二个循环,你可以使用一个布尔变量,它在两个循环的范围内
bool isTerminated = false;
for (...)
{
if (!isTerminated)
{
for(...)
{
...
isTerminated = true;
break;
}
}
else
{
break;
}
}
答案 6 :(得分:2)
可能最简单的方法是使用“flag”变量
for(i=0; i<10 && (done==false); i++)
for(j=0;j< 10; j++){
..
..
if(...){done=true; break;}
}
答案 7 :(得分:2)
在休息之前更改顶部循环计数器
for(i=0; i<10 ; i++)
for(j=0;j< 10; j++){
..
..
i = 10;
break;
}
答案 8 :(得分:2)
另一个解决方案是在函数中分解出第二个循环:
int i;
for(i=0; i<10 ; i++){
if !innerLoop(i) {
break;
}
}
bool innerLoop(int i)
int j;
for(j=0;j< 10; j++){
doSomthing(i,j);
if(endcondtion){
return false;
}
}
}
答案 9 :(得分:1)
break语句突破了最里面的循环。需要一个额外的测试和中断语句来突破外部循环。
答案 10 :(得分:0)
如果从一组嵌套循环中执行中断,则仅终止执行中断的最内层循环。 (就像标准C一样)
答案 11 :(得分:0)
与最后一个完全一样,通常是这样的:
for(i=0;i<a;i++){
for(j=0;j<a;j++){
if(Something_goes_wrong){
i=a;
break;
}
}
}
答案 12 :(得分:0)
只是为了咧嘴笑,如何将此真/假检查更改为方法并使用return
语句:
- (bool) checkTrueFalse: parameters{
for ( ...) {
for ( ... ) {
if (...) {
return true;
}
}
}
return false;
}