使用 goto 跳出嵌套循环
跳出嵌套循环通常需要使用布尔变量,并在循环中检查此变量。假设我们正在迭代 i
和 j
,它可能看起来像这样
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
的使用使错误流与正常程序控制流分开。然而,从技术意义上讲,它也被认为是非结构化的。