2011-11-07 39 views
5

假设你有两个嵌套像这样的循环:有没有办法打破C中的上级循环?

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
     } 
    } 
} 

有没有一种方法(只在一个循环类似于break;命令)结束当场两个环?

+8

'goto'是得心应手。 – Mat

+0

@Mat:这是个玩笑吗? – Rob

+3

@robjb我怀疑它是。这是'goto'完全正常的情况之一。对'goto'无条件的仇恨是错误的。 – GSerg

回答

13

您可以使用一个goto为:

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      goto done; 
     } 
    } 
} 
done: 

或使用其他变量来控制循环迭代:

int i, j; // Iterators 
int done = 0; 
for(i=0; i<100 && !done; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99 && !done; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      done = 1; 
     } 
    } 
} 
+0

+1,尽管人们不喜欢'goto',它比添加(如你的第二个选项) – MByD

+0

!完成标志被验证每个循环不是最优的,看起来似乎是 –

+1

+1。这就是我会做的。 'goto'更快,但也是危险的。奇怪的事情可能发生,如果你在写作时不注意的话。 标志的验证只能在外部循环中完成,在'done = 1;'之后加上'break',它会降低计算成本(虽然它对于今天的计算机来说非常小) – Victor

5

我们的好朋友goto可以为您处理!

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
      goto ExitLoopEarly; 
     } 
    } 
} 
goto ExitLoopNormal; 

ExitLoopEarly: 
.... 

ExitLoopNormal: 
... 
4

这可能是一个解决方案

function void loop() 
{ 
       int i, j; // Iterators 

      for(i=0; i<100; ++i) { 
       /* do some stuff */ 
       ... 
       for(j=0; j<99; ++j) { 
        /* do more stuff */ 
        ... 
        if(someFunction(j,i) == 2) { 
         return; 
        } 
       } 
      } 
} 
+0

这只会遇到一些情况,你忽略它可能在循环内使用的任何值。 – MByD

+0

你是什么意思?我无法真正理解你的意思 –

+0

可以说他在一个函数中有三个这样的双循环,并且在那些循环中他修改了函数的一些局部变量,他将需要传递(通过引用)每个变量在循环到函数。 goto或一些国旗似乎更合理。 – MByD

0

你可以插入两个lo OPS的功能和使用return

void foo(){ 
int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      return; 
     } 
    } 
} 
}