updated:
C语言中不借用中间值交换数据的方法
c语言中要实现两个变量的交换一般需要一个额外的变量,但借用位运算可以实现无需中间值的值交换,代码如下:
void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; }
以上代码使用了位运算中的‘异或’,即 ' ^ ' 对于异或,有如下法则:
1 ^ 1 = 0; 1 ^ 0 = 1; 0 ^ 0 = 0;
因此对数x,有
x ^ x = 0 且 x ^ 0 = x
将上述代码自下而上“展开”,可以得到对a来说,有:
*a = (*a ^ *b) ^ (*b ^ (*a ^ *b)) = (*a ^ *b) ^ *a = *b
对b来说同理,所以最终两指针指向位置的值交换。
然而这种方法会在a和b指向同一位置时出现错误,语句*a = *a ^ *b;会将指针指向位置的值意外地置为0,因此后续的操作失去意义。因此使用该函数前最好进行判断。