如何在循环后使用goto和run语句来关闭两个循环?

时间:2012-09-27 17:55:56

标签: c goto

我需要一些想法,试图让这个程序更具可读性。我认为这是关于设计师的问题,而不是其他问题。

我有两个循环:

for( ... ) {
  //... 
   for(...) {
     if(baa) {
       goto outer;
      } 
      //statements of 2-loop
    }
     //statements of 1-loop
}

它工作正常,如果baa具有非零值,则跳转到outer标签而不运行循环1和2的运行元素。但在return之前,我需要做一些{ {1}}如果调用了free()则调用独立:

goto outer

但如果我因为 if(a != NULL) free(a); if(b != NULL) free(b); 而来到这里,则不会调用上述代码。

我需要做以下事情:

goto

是什么让这个函数像这样:

   goto outer; //if normally exited from two-loops, go to outer anyway.

    outer: {
     if(a != NULL) free(a);
     if(b != NULL) free(b);
        return ret;
    }

我希望这很清楚。提前谢谢。

1 个答案:

答案 0 :(得分:3)

正常控制流忽略outer标签,它仅用作goto的目标,因此在循环后不需要它。此外,无需将标签后的语句分组为复合语句

char* foo(void) {
  char *ret = NULL;

  for( ... ) {
    //... 
    for(...) {
     if(baa) {
        ret = tmp_result;
        goto outer;
      } 

       //some statements of 2-loop
     }
       //some statements of 1-loop
    }

  outer:
     if(a != NULL) free(a);
     if(b != NULL) free(b);
     return ret;
}

完全相同(眼睛上的IMO更好)。