论不创建临时变量交换两个变量(C语言实现)

这里只用到两种方法来解决,欢迎各位大佬在评论区指点

创建临时变量交换来两个变量

  1. 使用函数交换
  2. 创建一个临时变量来交换

相信大家这种都以及是了如指掌,以上的两种方法都是通过创建一个临时变量来实现的,但是,如果不允许创建临时变量该使用什么方法?

不创建临时变量来交换两个变量

第一种方法

上代码

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;

	printf("交换前:a = %d, b = %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("交换前:a = %d, b = %d\n", a, b);
	return 0;
}

先是让a = a + b,然后b = a - b就相当于“ b = (a + b) - b”
所以这时候b就等于a了
最后的a = a - b就相当于a = (a + b) - a,(因为这时候b已经是a了)
所以这时候a就等于b了

这就没有创建临时变量来实现两个变量的交换

虽然这种方法看起来没什么问题,但是它隐藏很大的问题:
Int类型是有最大值和最小值的,当a很大的时候(还差一点就大于了Int能储存的最大值),b也是很大(还差一点就大于了Int能储存的最大值),那么当它们相加的时候,就会溢出,从而造成结果的不正确

所以这时候就要用到第二种方法

第二种方法

如果不知道按位异或操作符的话可能就不太好理解,有关这个操作符的解释会下一篇文章中提到,
这里先简单的叙述以下
^操作符就是将两个数的二进制(补码)比较,相异为0,相同为1

在讲解这个方法之前先打个铺垫

// 3 ^ 3 = 0;
// 011   // 3
// ^
// 011   // 3
// 000   // 0
 所以与本身按位异或就是0


// 0 ^ 5 = 5
// 000   // 0
// ^
// 101   // 5
// 101   // 5
 所以0与其他数按位异或就是本身



// 3 ^ 5 ^ 3 = 5;
// 先算3 ^ 5
// 011    // 3
// ^
// 101    // 5
// 110    // 3 ^ 5
// ^
// 011    // 3
// 101    // 5



// 3 ^ 3 ^ 5 = 5;
// 先算3 ^ 3
// 与第一段同理,是0
// 然后 0 ^ 5
// 与第二段同理,是本身(5)
// 
所以^(按位异或支持交换律)

上代码

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;

	printf("交换前:a = %d, b = %d\n", a, b);
	a = a ^ b;// a = 3 ^ 5
	b = a ^ b;// b = (3 ^ 5) ^ 5 = 0 ^ 3 = 3 
	a = a ^ b;// a = (3 ^ 5) ^ 3 = 0 ^ 5 = 5
	printf("交换前:a = %d, b = %d\n", a, b);
	return 0;
}

值得注意的就是:
b = a ^ b; // b = (3 ^ 5) ^ 5 = 3 ^ 0 = 3
这里的(3 ^ 5) ^ 5是交换了顺序,变成了5 ^ 5 ^ 3 = 0 ^ 3 = 3

a = a ^ b; // a = (3 ^ 5) ^ 3 = 0 ^ 5 = 5
这里的(3 ^ 5) ^ 3 是交换了顺序,变成了3 ^ 3 ^ 5 = 0 ^ 5 = 5

所以,如此一来就交换了两个变量,也没有创建临时变量

但是,是不是以后都这么交换两个变量?
当然不是,有两个原因

  1. 可读性不太好,没有创建临时变量的方法直观
  2. ^ 操作符只能运用与整数,其他的比如浮点数都不行
  3. 运行速度还没有创建临时变量的运行速度快

所以这种方法这是了解一下,长长见识而已

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值