不需要第三变量,实时交换数据

来源:互联网 发布:网络女歌手排行榜 编辑:程序博客网 时间:2024/06/05 18:44

深入理解计算机系统第二章P34页练习题

[cpp] view plaincopy
  1. void inplace_swap(int *x,int *y)  
  2. {  
  3.         *x = *x ^ *y;  
  4.         *y = *x ^ *y;  
  5.         *x = *x ^ *y;  
  6. }  

 

在深入理解计算机系统中有这样的一道习题,也是常见的面试题目,即不用第三个变量,实时交换二个数的值。上面代码是其实现其方法,但接下来提出了如下一个问题,如这个函数的基础上,实现将一个数组中元素头尾两端依次对调。这个函数实现起来比较简单,通过inplace_swap()这个函数把第1元素与最后一个元素对换,依此类推。书上给出如下的代码。

[cpp] view plaincopy
  1. void reverse_array(int a[], int cnt)  
  2. {  
  3.     int first,last;  
  4.     for (first = 0,last = cnt - 1;  
  5.          first <= last; first++,last-- )  
  6.     {  
  7.         inplace_swap(&a[first], &a[last]);  
  8.     }  

经过测试,如果数组元素为偶数个,其结果正确,如果数组个数为奇数个,则得到中间的元素为0。

看到这里,我想到for语句中的判断条件应该改为first < last;奇数个的话就没有必要交换了。但随后又想,就算是要判断,把二个数自己交换自己,应该得到的结果也是正确的啊??????

自己用手写了一下,觉得也应该是正确的,但我认为这书不会犯这样的低级错误,于是自己写了个简单程序测试了一下。

[c-sharp] view plaincopy
  1. include <stdio.h>  
  2. #include <stdlib.h>  
  3. void inplace_swap(int *x,int *y)  
  4. {  
  5.         *x = *x ^ *y;  
  6.         *y = *x ^ *y;  
  7.         *x = *x ^ *y;  
  8. }  
  9. int main(void)  
  10. {  
  11.         int a = 3;  
  12.         int b = 3;  
  13.         int c = 3;  
  14.         inplace_swap(&a,&b);  
  15.         printf("%d,%d/n",&a,&b);  
  16. //      inplace_swap(&c,&c);  
  17. //      printf("%d/n",c);  
  18.         return 0;  
  19. }  

得到的结果是:

3,3

0

验证了书上所说的是正确的,这时我自己想了想如果自己与自己交换,则每次都是从同一个地址中取值,如*x = *x ^ *y;x所指地址的值为0,即y所指的址址中的值也为0,所以接下来的运算肯定得到结果都为0;而如果是取二个值相同但是不同的变量来交换的话,还是满足条件的。

虽然只是一个小问题,但这个小问题反应出一个人的基本功。看样子,我的内功急需加强,每天前进一小步,几年后就是一大步,加油。