break 只能跳出最內層循環。若需從深層嵌套循環一次性跳出,有三種常見模式。
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (disaster()) goto cleanup;
}
}
cleanup:
// 收尾代碼
int status = OK;
for (int i = 0; i < N && status == OK; i++) {
for (int j = 0; j < M && status == OK; j++) {
if (disaster()) status = ERROR;
}
}
if (status == ERROR) { /* 處理 */ }
do { ... } while(0) 包裹外層,配合 break 模擬 goto。int process() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (disaster()) return ERROR_CODE;
}
}
return SUCCESS;
}
// 調用處
int ret = process();
if (ret == ERROR_CODE) { /* 處理 */ }
| 方法 | 可讀性 | 性能 | 適用場景 | 規範建議 |
|---|---|---|---|---|
| goto | 高(簡單時) | 最優 | 錯誤回滾、狀態機 | 謹慎使用,註釋說明 |
| 狀態標志 | 中(冗長) | 略有開銷 | 淺層嵌套、禁用 goto 環境 | 可接受 |
| 函數返回 | 高(模塊化) | 可內聯優化 | 通用業務邏輯、資源管理 | 首選 |
return 退出。goto,並加註釋說明意圖。-O2)會將尾部 return 轉為跳轉指令,性能無損。// 資源獲取即初始化 (RAII) 風格
int do_work() {
Resource *r1 = acquire1();
if (!r1) return ERR1;
Resource *r2 = acquire2();
if (!r2) { release1(r1); return ERR2; }
if (core_logic(r1, r2) != OK) {
release2(r2); release1(r1); return ERR_LOGIC;
}
release2(r2); release1(r1);
return OK;
}
這種「錯誤即返回、逐層釋放」模式是 C 語言工業級代碼的標準範式,比 goto 更安全、更易維護。