·

这里我可以提供两个错误的写法:

void swap_XOR(int* a, int* b) {
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}
void swap_add(int* a, int* b) {
   *a = *a + *b;
   *b = *a - *b;
   *a = *a - *b;
}

当指针a和指针b指向同一个内存时,无论它们共同指向地址是什么数值,最后都将被赋予0

Replies
5

你这俩方法可以的啊,不考虑溢出和类型是没问题的

void swap_XOR(int* a, int* b) {
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}

void swap_add(int* a, int* b) {
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
}

void main() {
	int a = 5, b = 2;

	swap_XOR(&a, &a);
	printf("%d %d\n", a, b);//输出0 2

	swap_add(&b, &b);
	printf("%d %d\n", a, b);//输出0 0
}

你这故意传一个变量的地址,那自然会出问题,这种行为应该是ub,实际上它们是可以用的

我感觉这两个方法(不溢出的话),逻辑上应该是可以完成交换;另外,如果故意传同一个地址的话,估计会被队友爆头的吧 (赶紧溜,哈哈哈) joy finally,感谢大佬分享 pray