| 特性 | return | break |
|---|---|---|
| 作用範圍 | 整個函數 | 單層迴圈 / switch |
| 可帶返回值 | 是 | 否 |
| 適用位置 | 函數內部任意處 | 迴圈/switch 內部 |
| 執行後流向 | 呼叫者的下一句 | 迴圈/switch 的下一句 |
| 清理機制 | 觸發區域物件解構 (C++)、變數作用域結束 | 僅離開塊,區域變數正常銷毀 |
/* 使用 return:找到即返回索引,未找到返回 -1 */
int find(const int *arr, size_t n, int target) {
for (size_t i = 0; i < n; ++i) {
if (arr[i] == target) return (int)i; // 直接離開函數
}
return -1;
}
/* 使用 break:需額外旗標變數 */
int find_v2(const int *arr, size_t n, int target) {
int idx = -1;
for (size_t i = 0; i < n; ++i) {
if (arr[i] == target) { idx = (int)i; break; } // 只離開迴圈
}
return idx; // 迴圈後仍需返回
}
結論:搜尋/驗證類函數**優先用 return**,邏輯最直觀、變數最少。
void process_matrix(int **mat, int rows, int cols) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (mat[i][j] < 0) {
printf("發現負值於 (%d,%d)\n", i, j);
return; // 直接離開整個函數
}
}
}
printf("全矩陣無負值\n");
}
若用 `break` 需雙重旗標或 `goto`,`return` 一行解決。
int handle_cmd(int cmd) {
switch (cmd) {
case CMD_QUIT: return 0; // 直接結束函數,返回 0
case CMD_PAUSE: break; // 只離開 switch,繼續執行後續代碼
default: return -1;
}
printf("命令 %d 已處理,繼續執行...\n", cmd);
return 1;
}
| 誤區 | 說明 |
|---|---|
| 以為 break 能跳出函數 | break 無法跨越函數邊界,只能跳出迴圈/switch |
| 在 main 中用 break 結束程式 | main 是函數,break 只會跳出 main 內的迴圈,程式繼續執行 |
| void 函數不能用 return | void 函數可用 `return;` (不帶值) 提前離開 |
return 是**函數級**控制流轉移,break 是**塊級** (迴圈/switch) 控制流轉移。搞清層級,代碼自然清晰。