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

标签 c goto

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

我有两个循环:

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/

相关文章:

java - 为什么 goto 在 Java 和其他高级编程语言中被认为是邪恶的?

c - 这个函数有什么问题吗?

c - OpenCL 将 MxN 矩阵转换为方阵

c - while(*s++=*t++) 相当于哪个表达式?

c++ - 在 llvm 的 IR 代码中添加函数调用

C 错误 : array type has incomplete element type

c - goto 语句在 c 语言中的使用频率是多少?

java - 检查按钮是否可用?如果不等待 5 秒再检查一次?

c - 在此代码中使用 goto 有什么好处?

自定义头文件实现