while(1) 是 C 語言中構造 無限迴圈(死循環) 的標準寫法。因為 C 語言中任何非零值均為「真」,1 恒真,迴圈條件永遠滿足,除非在迴圈體內執行 break、return 或 exit() 跳出。
在 Hoare 分區方案中,while(1) 用於雙指針交替掃描,直到指針交錯:
void quicksort(int k[], int s, int t) {
if (s < t) {
int i = s, j = t + 1;
int pivot = k[s]; // 基準值
while (1) { // 無限迴圈,內部靠 break 跳出
do i++; while (i != t && k[i] < pivot); // 向右找 ≥ pivot
do j--; while (j != s && k[j] > pivot); // 向左找 ≤ pivot
if (i < j)
swap(&k[i], &k[j]); // 交換
else
break; // 指針交錯,跳出無限迴圈
}
swap(&k[s], &k[j]); // 基準歸位
quicksort(k, s, j - 1); // 遞歸左半部
quicksort(k, j + 1, t); // 遞歸右半部
}
}
i >= j,但中間穿插著 do-while 邊界檢查,寫成單一 while 條件極其晦澀。while(1) 明確表達「持續執行直到內部決定停止」,配合 break 語義清晰。// 1. 事件循環 / 服務器主循環
while (1) {
request = get_request();
process(request);
}
// 2. 輸入驗證,直到合法
int x;
while (1) {
printf("輸入 1-100 之間的數: ");
if (scanf("%d", &x) == 1 && x >= 1 && x <= 100) break;
printf("輸入無效,重試。\n");
while (getchar() != '\n'); // 清理緩衝區
}
// 3. 菜單系統
while (1) {
show_menu();
choice = get_choice();
if (choice == EXIT) break;
dispatch(choice);
}
| 做法 | 說明 |
|---|---|
| ✅ 必須有跳出路徑 | 迴圈體內必須有 break/return/exit,否則真死循環 |
| ✅ 可用 for(;;) 替代 | for(;;) 與 while(1) 完全等價,純風格偏好 |
| ❌ 避免在嵌套迴圈裸用 | 內層 break 只能跳出內層,外層需額外標誌變量或 goto |
| ❌ 不要寫 while(true) | 需 #include <stdbool.h>,C89 不支援,移植性差 |
while(1) 是 C 語言表達「無限重複直到滿足特定條件跳出」的地道寫法。在快速排序、事件循環、輸入驗證、狀態機等場景極為常見。掌握其「迴圈體內部控制流向」的設計模式,能寫出更簡潔、高效的系統級代碼。