最近遇到的一些坑

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时作为出口,则尽量使用有符号类型。

猜你喜欢

转载自blog.csdn.net/qq_26818479/article/details/85037613