使用 goto 跳出嵌套循环

跳出嵌套循环通常需要使用布尔变量,并在循环中检查此变量。假设我们正在迭代 ij,它可能看起来像这样

size_t i,j;
for (i = 0; i < myValue && !breakout_condition; ++i) {
    for (j = 0; j < mySecondValue && !breakout_condition; ++j) {
        ... /* Do something, maybe modifying breakout_condition */
            /* When breakout_condition == true the loops end */
     }
}   

但是 C 语言提供了 goto 子句,在这种情况下可能很有用。通过将它与循环后声明的标签一起使用,我们可以轻松地摆脱循环。

size_t i,j;
for (i = 0; i < myValue; ++i) {
    for (j = 0; j < mySecondValue; ++j) {
        ...
        if(breakout_condition) 
          goto final;
    }
}
final:

然而,通常当这种需求出现时,可以更好地使用 return。该结构在结构编程理论中也被认为是非结构化的

goto 可能有用的另一种情况是跳转到错误处理程序:

ptr = malloc(N *  x);
if(!ptr)
  goto out_of_memory;

/* normal processing */
free(ptr);
return SUCCESS;

out_of_memory:
 free(ptr); /* harmless, and necessary if we have further errors */
 return FAILURE;

goto 的使用使错误流与正常程序控制流分开。然而,从技术意义上讲,它也被认为是非结构化的