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

C 語言指針數組排序陷阱:一個分號導致的邏輯災難

     編輯:程式設計疑難解答

錯誤代碼

void rankArr(char *pr[]) {
    char *temp;
    int i, j;
    for (i = 0; i < 5; i++) {
        for (j = i + 1; j < 5; j++) {
            if (strcmp(pr[i], pr[j]) > 0);  // <=== 這裡多了一個分號!
            {
                temp = pr[j];
                pr[j] = pr[i];
                pr[i] = temp;
            }
        }
    }
}

災難現場

if (condition); 等價於:


if (condition) 
    ;  // 空語句,什麼都不做
{      // 這是一個獨立的代碼塊,無條件執行!
    swap(...);
}

結果:**每輪內層循環無條件交換**,數組陷入混亂,輸出結果完全錯誤。

正確寫法


if (strcmp(pr[i], pr[j]) > 0) {  // 無分號,大括號包裹執行體
    temp = pr[j];
    pr[j] = pr[i];
    pr[i] = temp;
}

避坑鐵律

  1. 永不在 if/for/while 後直接寫分號,養成「條件後必跟大括號」習慣,哪怕只有一條語句。
  2. 開啟編譯器警告:GCC/Clang -Wempty-body、MSVC /Wall 會提示「empty statement after if」。
  3. 靜態分析工具:Cppcheck, SonarQube, PVS-Studio 能自動檢測此類語義錯誤。

補充:兩種排序邏輯對比

修復分號後,兩版邏輯均能正確排序,冒泡版更直觀易驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
版本邏輯特點
錯誤版(選擇排序變體)j = i+1 比較剩餘元素交換次數少,但單次遍歷未必將最小值冒泡到最前
註釋版(冒泡排序)j = 0; j < 4-i 相鄰比較每輪將最大值沉底,邏輯經典但交換次數多