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 級垃圾值)。
i <= 4 配合循環體內多次 i++,導致 i 最大達到 8,訪問 a[5]~a[8] 越界,讀取棧上隨機內存 (垃圾值)。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),嚴格防越界。if,互不干擾,無 i++ 副作用。
#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 次更優,且線程安全、無副作用。i++, i--) → **重寫為單一自增**。a[i] > a[i++] 類表達式 → **立即拆分為獨立語句**,C++ 求值順序未規定。「單遍歷、雙獨立判斷、零副作用」是求極值的工業級標準模式,拒絕花式寫法帶來的未定義行為。