break 僅跳出**直接包含它的那一層**迴圈或 switch**,外層迴圈繼續執行。
#include
int main(void) {
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (j == 1) {
printf(" 內層 break at j=%d\n", j);
break; // 只跳出 j 迴圈
}
printf("(%d,%d) ", i, j);
}
printf(" 外層 i=%d 繼續\n", i);
}
return 0;
}
(0,0) 內層 break at j=1
外層 i=0 繼續
(1,0) 內層 break at j=1
外層 i=1 繼續
(2,0) 內層 break at j=1
外層 i=2 繼續
bool stop = false;
for (int i = 0; i < 10 && !stop; ++i) {
for (int j = 0; j < 10; ++j) {
if (matrix[i][j] == target) {
printf("找到於 (%d,%d)\n", i, j);
stop = true;
break; // 跳出內層
}
}
}
bool find_target(int **matrix, int rows, int cols, int target, int *out_i, int *out_j) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (matrix[i][j] == target) {
*out_i = i; *out_j = j;
return true; // 直接跳出所有層級
}
}
}
return false;
}
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
if (condition) goto OUT_BOTH;
}
}
OUT_BOTH:
printf("已跳出雙層\n");
限制:`goto` 標籤必須在**同一函數內**,且易破壞結構化程式設計,僅作為最後手段。
| 語句 | 跳出範圍 | 適用場景 | 風險 |
|---|---|---|---|
break | 單層迴圈/switch | 單層提前結束 | 無 |
continue | 單層本次迭代 | 跳過剩餘主體 | while 中易忘 step 導致無限迴圈 |
return | 整個函數 | 搜尋/驗證函數 | 需封裝函數 |
goto | 同函數任意標籤 | 極深巢狀無法重構時 | 破壞結構、難維護 |
巢狀迴圈中 break **只穿透一層**。遇到多層跳出需求,**先想「能不能拆成函數 return」**,否則用旗標變數。這是 C 語言結構化程式設計的鐵律。