###交换两个数的值
1.使用中间变量:
void swap(char *a, char *b)
{
chat tmp = *a;
*a = *b;
*b = tmp;
}
这种方式的好处:
- 最为直接符合人们的日常逻辑;
- 避免不必要的错误,看下面的第二种和第三种方式就知道了;
2.不使用中间变量 -- 异或
版本1:
void swap(char *a, char *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
上面的方式利用的原理主要是:一个数与另一个数异或两次会得到本身。
可以测试下,上面的程序在绝大多数情况下都是正确的,但是有一种例外, 如下面的代码:
char a = 'a';
swap(&a, &a);
会发现交换后a的值变为0了。其中的原因就是两个需要交换的变量使用了同 一份内存。因此,改进后的版本应该如下:
版本2:
void swap(char *a, char *b)
{
if (a == b)
return;
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
3.不使用中间变量 -- 相加
版本1:
void swap(char *a, char *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
版本1同样存在上面提到的问题,因此同样需要改进:
版本2:
void swap(char *a, char *b)
{
if (a == b)
return ;
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
总结: 对于一个函数的多个参数传递同一份内存时,需要超级小心。