立即跳出**最近一層** `switch`、`for`、`while`、`do-while`**,程式繼續執行該結構之後的第一條語句。
#include
int main(void) {
for (int i = 1; i <= 10; ++i) {
if (i == 6) {
printf("遇到 %d,提前結束迴圈\n", i);
break; // 直接跳出 for,不再執行 i=6~10
}
printf("%d ", i);
}
printf("\n迴圈結束後的程式碼\n");
return 0;
}
1 2 3 4 5 遇到 6,提前結束迴圈
迴圈結束後的程式碼
int find_index(const int *arr, size_t n, int target) {
for (size_t i = 0; i < n; ++i) {
if (arr[i] == target) return (int)i; // 找到直接返回 (比 break 更乾淨)
}
return -1; // 未找到
}
提示:函數中搜尋找到即返回,比 `break` + 旗標變數更簡潔。
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (j == 1) break; // 只跳出內層 j 迴圈
printf("(%d,%d) ", i, j);
}
printf("\n");
}
/* 輸出:
(0,0)
(1,0)
(2,0)
*/
bool found = false;
for (int i = 0; i < 10 && !found; ++i) {
for (int j = 0; j < 10; ++j) {
if (condition) { found = true; break; }
}
}
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
if (condition) goto OUT;
}
}
OUT:
printf("跳出雙層迴圈\n");
僅用於**極少數**極深巢狀且旗標讓代碼混亂時。
bool search_matrix(int **mat, int rows, int cols, int target) {
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
if (mat[i][j] == target) return true;
return false;
}
| 關鍵字 | 作用 | 後續流程 |
|---|---|---|
break | 結束整個迴圈 | 執行迴圈後的下一句 |
continue | 結束**本次**迭代 | 執行 step (for) 或 直接判斷條件 (while) |
switch (ch) {
case 'a': do_a(); break; // 必須 break,否則貫穿執行 case 'b'
case 'b': do_b(); break;
default: do_default();
}
break 是**單層迴圈/分支的緊急剎車**。善用「函數早返回」替代旗標+break,遇到多層跳出優先重構為函數,實在無法才用旗標或極少數 `goto`。記住:**break 只穿透一層**。