使用 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
的使用使錯誤流與正常程式控制流分開。然而,從技術意義上講,它也被認為是非結構化的。