在C語言程式設計中,常遇到需要計算陣列元素交替加減的需求,例如計算 data[0] - data[1] + data[2] - data[3] + ... - data[99]。一位初學者編寫程式時,發現執行結果顯示 -1.QNAN00000000(無效數值),而使用標記變數 sign = -sign 的寫法卻能得到正確結果。
錯誤的核心在於迴圈條件判斷。原程式碼中迴圈條件設為 i < 100,但每次迴圈處理兩個元素(一減一加),實際上只需迴圈 50 次。當 i 達到 50 時,存取 data[100] 已經超出陣列範圍(有效索引 0~99),導致未定義行為,產生 NaN(非數值)。
int sum = 0;
int sign = 1;
for (int i = 0; i < 100; i++) {
sum += sign * data[i];
sign = -sign; // 正負號交替翻轉
}
這種寫法邏輯清晰:sign 初始為 1,每次迴圈結束翻轉符號,自然實現 + - + - 的效果,且迴圈條件 i < 100 完全正確,不會越界。
sign = -sign 是切換正負號的經典技巧,簡潔高效。
