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