交换两个变量的多种方法(面试题)

假设有变量a和b,对其初始化并进行值的交换,看起来似乎是很简单,但其实不然,接下来将演示几种详细的方法

1.创建第三变量C

把c当作媒介来替换a和b的值 ,这也是较为简便普通的方法,代码如下:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	printf("打印前:%d %d\n", a, b);
	c = a;
	a = b;
	b = c;
	printf("打印后:%d %d\n", a, b);
	return 0;
}

2.借助加减抵消数值

为a和b分别赋予特殊值消除其所原来拥有的值,使其成为空值的巧妙方法,如下:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	printf("打印前:%d %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("打印后:%d %d\n", a, b);
	return 0;
}

3.借助自定义交换函数计算

刚开始我们或许会简单的仿照我们常用的加和函数的写法来写一个交换函数,输入10和20如下:

#include <stdio.h>
void Swap1(int x, int y)
{
 int c = x;
 x = y;
 y = c;
}
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 printf("交换前:a=%d b=%d\n", a, b);
 Swap1(a, b);
 printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}

 然而代码的运算结果并没有交换a和b的值

这个代码乍一看确实无比正确,没有什么错误

但通过在X86环境下一步步调试能够发现在Swap1函数中确实交换了x和y的值,但是x和y只是形参,a和b是实参,函数Swap1只是零时创建的函数栈帧,x和y交换后的值并没有分别返回给a和b,x和y确实接收到了a和b的值,不过x的地址和a的地址不 ⼀样,y的地址和b的地址不⼀样,相当于x和y是独立的空间,那么在Swap1函数内部交换x和y的值, 自然不会影响a和b,当Swap1函数调用结束后回到main函数,a和b的没法交换。

Swap函数使用的时候,是把变量本⾝直接传递给了函数,这种调用函数的方式我们之前在函数的时候就知道了,这种叫传值调用

那怎么办呢?
我们现在要解决的就是当调用Swap函数的时候,Swap函数内部操作的就是main函数中的a和b,直接将a和b的值交换了。那么就可以使用指针了,在main函数中将a和b的地址传递给Swap函数,Swap 函数里边通过地址间接的操作main函数中的a和b,并达到交换的效果就好了。
#include <stdio.h>
void Swap2(int* px, int* py)
{
	int c = 0;
	c = *px;
	*px = *py;
	*py = c;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%d\n", a, b);
	Swap2(&a, &b);
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

 

我们可以看到实现成Swap2的方式,顺利完成了任务,这里调Swap2函数的时候是将变量的地址传
递给了函数,这种函数调用方式叫:传址调用
传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用。如果函数内部要修改 主调函数中的变量的值,就需要传址调用。

4.利用按位异或操作符交换

#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

 

看到这种解法的时候我也感到很震惊,确实有种为了解题而想出来的,但我们只要知道两个相同的数按位异或等于0,任何数按位异或0都等于它本身,那么这串代码就不难理解了

以上是我对一道面试题的多种解法,看完这篇文章给小编一个三连是对小编最大的鼓励,小编也会互三滴!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值