0

我需要一些想法来尝试使这个程序更具可读性。我认为这更多的是关于设计师的问题。

我有两个循环:

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

它工作正常,如果baa具有非零值,则跳转到outer没有循环 1 和 2 的运行状态的标签。但在之前,如果被调用return,我需要做一些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;
    }

是什么让这个函数变成了这样:

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
    }

  goto outer;

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

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

4

1 回答 1

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 对眼睛更好一些)。

于 2012-09-27T18:10:00.463 回答