本文記錄結對開發過程,解決「一維陣列最大子陣列和」問題,並重點攻克整數溢位檢測難題。採用逆向思維:預先計算 INT_MAX - 目前累加和,若小於下一個加數則判定溢位,即時終止程式。
INT_MAX (2,147,483,647) 導致未定義行為if (INT_MAX - sum < next_val) {
printf("數值過大,發生溢位\n");
system("PAUSE");
exit(1);
}
sum += next_val;
此寫法避免了實際相加後再檢查(此時已發生溢位),符合 C 語言標準的安全檢查模式。
int shuchu(int m[], int sz, int xhy) {
int c[10], v[10], *temp = malloc(2*sz*sizeof(int));
// 複製子陣列
for (int t = sz-xhy-1; t < sz; t++)
c[t-sz+xhy+1] = m[t];
// 計算所有前綴和
for (int t = xhy; t >= 0; t--) {
int sum = 0;
for (int p = 0; p <= t; p++) {
if (INT_MAX - sum < c[p]) { /* 溢位處理 */ }
sum += c[p];
}
v[t] = sum;
temp[t] = sum;
}
// 找最大
int max = v[0];
for (int t = 0; t <= xhy; t++)
if (max <= v[t]) max = v[t];
return max; // 實際回傳陣列指標,此處簡化
}
INT_MAX 與 INT_MIN 邊界long long 擴大範圍,或引入大數庫SAFE_ADD(a,b,result) 提高複用性此練習深刻體會到「讓程式在錯誤發生前停下」的防禦性程式設計哲學,也是結對開發中知識傳遞與品質把關的生動案例。