void inplace_swap(int *x,int *y){ *y=*x^*y; *x=*x^*y; *y=*x^*y; }
在inplace_swap函数的基础上,你决定写一段代码, 实现将一个数组中的元素头尾两端依次对调。你写出下面这个函数:
1 void reverse_array(int a[], int cnt) { 2 int first, last; 3 for (first =0, last = cnt-1; 4 first <= last; 5 first++,last--) 6 inplace_swap(&a[first] , &a[last]); 7 }
当你对一个包含元素1、2、3和4的数组使用这个函数时,正如预期的那样,现在数 组的元素变成了 4、3、2和1。不过,当你对一个包含元素1、2、3、4和5的数组使 用这个函数时,你会很惊奇地看到得到数字的元素为5、4、0、2和1。实际上,你会 发现这段代码对所有偶数长度的数组都能正确地工作,但是当数组的长度为奇数时, 它就会把中间的元素设置成0。
A.对于一个长度为奇数的数组,长度cnt=2k+ 1,函数reverse_array最后一次 循环中,变量first和last的值分别是什么?
B.为什么这时调用函数inplace_swap会将数组元素设置为0?
C.对reverse_array的代码做哪些简单改动就能消除这个问题?