C语言交换两个整型数据


前言

交换两个整型数据是C语言中的经典问题,虽然简单,但是道道还是不少的,看官老爷们请往下看.


方法一:引入临时变量

引入:有a, b两个一样的瓶子,a瓶装满了醋,b瓶装满了酱油,现需要将两者瓶子装的东西调换一下,即a瓶装酱油,b瓶装醋.

分析:找一个相同的空瓶子c,先将a瓶中的所有醋放入c瓶中,此时a瓶已空,再将b瓶中的酱油放入a瓶中,最后将c瓶中的醋放入b瓶中,此时醋和酱油瓶交换完毕,交换两个整形变量也可以采用类似的思想来解决问题.

代码如下:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int tmp = 0;
	scanf("%d%d", &a, &b);
	printf("a = %d, b = %d\n", a, b);
	
	tmp = a;
	a = b;
	b = tmp;
	
	printf("a = %d, b = %d\n", a, b);
	return 0;
}
上述代码的优点是可读性好,效率较高,缺点是可能会因引入临时变量而导致不符合考试的一些考题的要求,但是平时还是推荐写这样交换的交
换算法.

方法二:不引入临时变量

1.使用加减法实现交换数据

代码如下:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	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;
}
上述代码的优点是不引入临时变量,可能符合考试中的一些考题的要求,缺点是可能因有溢出风险产生bug,且可读性不好,不推荐平时使用这
种交换算法.

2.使用不进位的加法即异或运算实现交换数据

代码如下:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	printf("a = %d, b = %d\n", a, b);
	
	a ^= b;
	b ^= a;
	a ^= b;
	
	printf("a = %d, b = %d\n", a, b);
	return 0;
}
上述代码的优点是不引入临时变量,可能符合考试中的一些考题的要求且异或运算是不进位的加法不会因有溢出风险而产生bug,缺点是可读
性差且效率较低,不推荐平时使用这种交换算法.

方法一和方法二都是写在主函数内的交换算法,如果将交换算法抽象成一个函数进行交换数据要注意一些小问题,如下述代码中的MySwap函数中的参数是进行的数值传递,导致交换失败,而_my_swap函数中的参数是进行的地址传递,交换成功,所以在被调函数中要改变调用函数中的数据时传参必传地址.

#include <stdio.h>
#include <assert.h>

void MySwap(int a, int b)
{
	int t = 0;
	t = a;
	a = b;
	b = t;	
}

void _my_swap(int* pa, int* pb)
{
	assert(pa != NULL && pb != NULL);
	int t = 0;
	t = *pa;
	*pa = *pb;
	*pb = t;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	printf("a = %d, b = %d\n", a, b);
	MySwap(a, b);//传值,交换失败
	printf("a = %d, b = %d\n", a, b);
	_my_swap(&a, &b);//传址,交换成功
	printf("a = %d, b = %d\n", a, b);
	
	return 0;
}

总结:

以上就是今天要讲的内容,本文简单介绍了C语言中的两个整数数据的交换实现以及注意事项,而且提出了各种交换方法的优缺点,仅供参考,如文章中有错误,欢迎大家在评论区中批评指正,笔者也会第一时间进行修改,fenice321顿首!!!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值