// 下面时交换两个数的函数
void swap(int *a, int *b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
当传入的a和b的地址不是同一个地址的情况下,函数正常工作
int a = 1;
int b = 2;
swap(&a, &b);
// 得到a=2,b=1
当传入的a和b的地址是同一个地址的情况下,函数不正常工作
int a = 1;
swap(&a, &a);
// 得到a=0
为什么会这样呢?我们来分析一下
// a=b=0xff,0xff->1
void swap(int *a, int *b) {
// 0xff->0
*a = *a ^ *b;
// 0xff->0
*b = *a ^ *b;
// 0xff->0
*a = *a ^ *b;
}
我们来看看其他情况
int a = 1;
int b = 1;
swap(&a, &b);
// 得到a=1,b=1
为什么会这样呢?我们来分析一下
// a=0xff,0xff->1,b=0xfe,0xfe->1
void swap(int *a, int *b) {
// 0xff->0,0xfe->1
*a = *a ^ *b;
// 0xff->0,0xfe->1
*b = *a ^ *b;
// 0xff->1, 0xfe->1
*a = *a ^ *b;
}