我需要想法来尝试使这个程序更具可读性。我认为这更多是关于设计师的问题。
我有两个循环:
for( ... ) {
//...
for(...) {
if(baa) {
goto outer;
}
//statements of 2-loop
}
//statements of 1-loop
}
它工作正常,如果 baa
具有非零值,则跳转到 outer
标签而不运行循环 1 和 2 的 stataments。但在 return
,如果调用了 goto outer
,我需要做一些独立的 free()
调用:
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;
}
}
我希望这是清楚的。提前致谢。
最佳答案
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;
}
完全一样(而且在我看来是不是更美观)。
关于c - 如何在循环后使用 goto 和 run 语句退出两个循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627354/