根据不使用中间变量交换两个变量值算法可进一步扩展到数组中:
#include <stdio.h> void change(int* a, int* b) { *b = *a ^ *b; *a = *a ^ *b; *b = *a ^ *b; } // a[] 为数组 // cnt为数组长度 void reverse_array(int a[], int cnt) { int first, last; for(first = 0, last = cnt -1; first < last; first++, last--) { change(&a[first], &a[last]); } } void print_array(int a[], int cnt) { int i; for(i = 0; i < cnt; i++) { printf("a[%d]=%d\n", i, a[i]); } } int main() { int array[5] = {1, 2, 3, 4, 5}; print_array(array, 5); reverse_array(array, 5); printf("\n"); print_array(array, 5); }
这里需要注意一点,change函数在作交换时,不能对自身做, 比如:
int x = 3; change(&x, &x); printf("x=%d\n", x);
这将导致x结果为0, 原因在于change函数改变了引用地址中的值:
*b = *a ^ *b;
// 此时如果*a==*b, 那么根据波尔规则,a^a=0 , *b的值被设置为0,
//又因为a于b指向同一块内存,赋值后*a也被设置为0
*a = *a ^ *b;
// 接着*a = 0 ^ 0 , 那么*a还是0
*b = *a ^ *b;
// 最后 *b = 0 ^ 0 , 结果自然变为0