最近遇到的一些坑
阿新 • • 發佈:2018-12-17
C++ 邏輯判斷的順序是從左向右的。conditionA&&conditionB 與 conditionB&&conditionA並不一定等價。
舉個例子:
void InsertSort(vector<int> &arr, int length) { for (size_t i = 1; i < length; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] < key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } }
由於j是int型別,所以在key==5的那次迴圈裡,j最終會變成-1,設j>=0為conditionA arr[j]<key為conditionB,假如交換AB的順序,arr[j]->arr[-1],會報出 out_of_range的異常,解決方案1:按這個例子來編寫AB順序,解決方案B是將j設定為size_t型別。
在非容器操作中,則是另一種情況:
void InsertSort(int arr[], int length) { for (size_t i = 1; i < length; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] < key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } }
假設將j設定為size_t型別,則由於j==0的時候進行j--;返回一個無符號整形最大值,這種原生陣列越界C++甚至不會給出錯誤提示,算是很隱蔽的bug。
總結:1:在編寫程式的時候,為了避免錯誤,儘可能的使用stl容器
2:進行迴圈操作的時候,明確自己的意圖;如果是以下標為0時作為出口,則儘量使用有符號型別。