swap(a,b)引出的问题

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;而如果是取二个值相同但是不同的变量来交换的话,还是满足条件的。

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

你可能感兴趣的:(c,面试,测试,include)