Skip to content

Latest commit

 

History

History
87 lines (67 loc) · 1.34 KB

swap-two-variable.md

File metadata and controls

87 lines (67 loc) · 1.34 KB

###交换两个数的值

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;
}

总结: 对于一个函数的多个参数传递同一份内存时,需要超级小心。