深入理解计算机系统第二章P34页练习题
- void inplace_swap(int *x,int *y)
- {
- *x = *x ^ *y;
- *y = *x ^ *y;
- *x = *x ^ *y;
- }
在深入理解计算机系统中有这样的一道习题,也是常见的面试题目,即不用第三个变量,实时交换二个数的值。上面代码是其实现其方法,但接下来提出了如下一个问题,如这个函数的基础上,实现将一个数组中元素头尾两端依次对调。这个函数实现起来比较简单,通过inplace_swap()这个函数把第1元素与最后一个元素对换,依此类推。书上给出如下的代码。
- 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]);
- }
经过测试,如果数组元素为偶数个,其结果正确,如果数组个数为奇数个,则得到中间的元素为0。
看到这里,我想到for语句中的判断条件应该改为first < last;奇数个的话就没有必要交换了。但随后又想,就算是要判断,把二个数自己交换自己,应该得到的结果也是正确的啊??????
自己用手写了一下,觉得也应该是正确的,但我认为这书不会犯这样的低级错误,于是自己写了个简单程序测试了一下。
- include <stdio.h>
- #include <stdlib.h>
- void inplace_swap(int *x,int *y)
- {
- *x = *x ^ *y;
- *y = *x ^ *y;
- *x = *x ^ *y;
- }
- int main(void)
- {
- int a = 3;
- int b = 3;
- int c = 3;
- inplace_swap(&a,&b);
- printf("%d,%d/n",&a,&b);
- // inplace_swap(&c,&c);
- // printf("%d/n",c);
- return 0;
- }
得到的结果是:
3,3
0
验证了书上所说的是正确的,这时我自己想了想如果自己与自己交换,则每次都是从同一个地址中取值,如*x = *x ^ *y;x所指地址的值为0,即y所指的址址中的值也为0,所以接下来的运算肯定得到结果都为0;而如果是取二个值相同但是不同的变量来交换的话,还是满足条件的。
虽然只是一个小问题,但这个小问题反应出一个人的基本功。看样子,我的内功急需加强,每天前进一小步,几年后就是一大步,加油。