代码改变世界

请用if-else if

2011-10-04 13:59  justvi  阅读(280)  评论(0编辑  收藏  举报

话说在写归并排序的时候,碰到了问题,因为gdb用得不太熟练,折腾了半天,才搞明白为什么出了问题。

且看以下代码:

 1 void merge(int *a, int l, int m, int u)
2 {
3 int lstart = l;
4 int lend = m;
5 int rstart = m + 1;
6 int rend = u;
7 int n = u - l + 1;
8 int *temp = (int *)malloc(sizeof(int) * n);
9 int i;
10 for (i = 0; lstart <= lend && rstart <= rend; ++i)
11 {
12 if (a[lstart] <= a[rstart])
13   temp[i] = a[lstart++];
14 if (a[lstart] > a[rstart])
15   temp[i] = a[rstart++];
16 }
17 while (lstart <= lend)
18   temp[i++] = a[lstart++];
19 while (rstart <= rend)
20   temp[i++] = a[rstart++];
21 memcpy(a+l, temp, n * sizeof(int));;
22 free(temp);
23 temp = NULL;
24 }

这是开始时写的一个函数,但是不知道为什么总是不能得出正确结果,纠结了半天后来将第14行换为:

else if (a[lstart] > a[rstart])

就正确了。在第一个版本中,两个if后的条件都要进行判断,由于在第一个if的执行体中lstart有加1的动作会影响到第二个if的判断,所以会影响到结果。