逆序枚举时常犯的一个错误

一 写在开头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 }
相关文章
相关标签/搜索