gpt4 book ai didi

c - 如何在循环后使用 goto 和 run 语句退出两个循环?

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:18 26 4
gpt4 key购买 nike

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

我有两个循环:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com