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

C++ 循環中同時求最大最小值導致數據溢出:數組越界與邏輯錯誤雙重定位

     編輯:程式設計綜合問答

錯誤代碼現場


for (i = 0; i <= 4; i++) {
    if (a[i] > a[i++]) { max = a[i]; min = a[i++]; }
    else { max = a[i++]; min = a[i++]; }
}

現象:僅求 max 時正常,加入 min 後輸出極大數值 (如 10^9 級垃圾值)。

雙重致命錯誤

  1. 循環條件越界: i <= 4 配合循環體內多次 i++,導致 i 最大達到 8,訪問 a[5]~a[8] 越界,讀取棧上隨機內存 (垃圾值)。
  2. 邏輯錯誤: 單次循環內多次 i++ 破壞遍歷語義,且 a[i] > a[i++] 行為未定義 (C++ 不保證運算順序),比較對象混亂。

正確算法:單次遍歷雙變量更新


int max = a[0], min = a[0];
for (int i = 1; i < 5; i++) { // 從 1 開始,避免自比較
    if (a[i] > max) max = a[i];
    if (a[i] < min) min = a[i];
}

關鍵修正點

  • 初始化: max = min = a[0],而非未初始化的變量。
  • 循環範圍: i = 1; i < n; i++ (n=5),嚴格防越界。
  • 獨立判斷: max/min 兩個獨立 if,互不干擾,無 i++ 副作用。
  • 邊界情況: n=0 時需單獨處理 (拋出異常/返回標誌)。

進階:C++17 結構化綁定 + 標準算法


#include 
#include 
std::array arr = { /* ... */ };
auto [min_it, max_it] = std::minmax_element(arr.begin(), arr.end());
int min = *min_it, max = *max_it;
  • std::minmax_element 僅需 1.5n 次比較,比雙循環 2n 次更優,且線程安全、無副作用。
  • 返回迭代器對,配合結構化綁定極其優雅。

調試心法

  1. 見到「正常功能加入新邏輯後輸出垃圾值」 → **首查數組/指針越界**。
  2. 見到循環體修改循環變量 (i++, i--) → **重寫為單一自增**。
  3. 見到 a[i] > a[i++] 類表達式 → **立即拆分為獨立語句**,C++ 求值順序未規定。

「單遍歷、雙獨立判斷、零副作用」是求極值的工業級標準模式,拒絕花式寫法帶來的未定義行為。

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