逆序枚舉時常犯的一個錯誤

一 寫在開頭spa

1.1 本節內容code

分享一個剛剛調通的BUG的過程與結果。blog

 

二 排錯過程與緣由分析索引

今天在寫代碼的過程當中發現了一個頗有意思的BUG,觸發該BUG的緣由很簡單,並且我以前也遇到過。看來這個BUG挺廣泛的。首先,你們請看下面的這段代碼。for循環

1 int GetDistance(int A[], int n) 2 { 3     int i, sum = 0; 4 
5     sum += (A[n-1] - A[0]) * (A[n-1] - A[0]); 6     for (i = n - 2; i >= 0; i++) 7         sum += (A[i] - A[i + 1]) * (A[i] - A[i + 1]); 8     return sum; 9 }

這段代碼看上去一點問題也沒有,但實際上,它卻引起了段錯誤!問題出在哪呢?很簡單,這段代碼使用的是逆序的方式枚舉的,也就是索引i是從大變到小的。可是,由於在平時寫的可能是順序枚舉,因此順手將i--(自減)寫成了i++(自增),因而程序奔潰了!class

 

怎麼避免這個問題?沒法避免!只能本身內心多根弦——逆序枚舉,i--;順序枚舉,i++。具體到上述代碼,只要把for循環中的i++改爲i--就行了。循環

1 int GetDistance(int A[], int n) 2 { 3     int i, sum = 0; 4 
5     sum += (A[n-1] - A[0]) * (A[n-1] - A[0]); 6     for (i = n - 2; i >= 0; i--) 7         sum += (A[i] - A[i + 1]) * (A[i] - A[i + 1]); 8     return sum; 9 }
相關文章
相關標籤/搜索