1. 程式人生 > >最近遇到的一些坑

最近遇到的一些坑

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時作為出口,則儘量使用有符號型別。