首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言 while(1) 深度解析:快速排序中的無限迴圈妙用

     編輯:C 語言問答

while(1) 是什麼?

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);      // 遞歸右半部
    }
}

為什麼不用 while(條件)?

  • 雙向掃描邏輯複雜:左指針右移、右指針左移,終止條件是 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 語言表達「無限重複直到滿足特定條件跳出」的地道寫法。在快速排序、事件循環、輸入驗證、狀態機等場景極為常見。掌握其「迴圈體內部控制流向」的設計模式,能寫出更簡潔、高效的系統級代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved