这里为什么数组个数位奇数会出现0的情况呢?
先贴代码:
#include <stdio.h>
void inplace_swap(int *x, int *y)
{
printf("%d, %d\n", *x, *y);
*y = *x ^ *y;
printf("%d, %d\n", *x, *y);
*x = *x ^ *y;
printf("%d, %d\n", *x, *y);
*y = *x ^ *y;
printf("%d, %d\n\n", *x, *y);
}
void reverse_array(int a[], int cnt)
{
int first, last;
for(first = 0, last = cnt-1; first <= last;
first++, last--)
{
inplace_swap(&a[first], &a[last]);
}
}
int main()
{
int a[] = {1, 2, 3, 4, 5};
reverse_array(a, 5);
int i;
for(i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
}
我中间将每一次变换过程都打印出来了,结果如下:
1, 5
1, 4
5, 4
5, 1
2, 4
2, 6
4, 6
4, 2
3, 3
0, 0
0, 0
0, 0
5 4 0 2 1
可以看到,****inplace_swap(&a[3], &[3])***进行y = *x ^ *y之后,x和y就都变成0了,这是因为x和y是同一个变量,拥有同一个对应的地址,当y对应的地址中的数变成0之后,x对应的地址也就是y对应的地址中的数变成0,也就是x变成0了,很容易知道最后x=y=0。
那么如何解决呢?
void reverse_array(int a[], int cnt)
{
int first, last;
for(first = 0, last = cnt-1; first <= last;
first++, last--)
{
if(first == last)
{
continue;
}
inplace_swap(&a[first], &a[last]);
}
}
很简单,加一个判断就行了。