不能创建第三个变量,实现两个数的交换

devtools/2024/9/23 6:02:27/

目录

常规实现两个数的交换(如:交换变量a和变量b)

方法一:加减法

方法二:异或操作符


常规实现两个数的交换(如:交换变量a和变量b)

创建一个临时变量tmp,先将其中一个变量a存放在临时变量tmp中,此时变量a的值则可被替换为变量b,然后再将b的值替换为tmp,此时变量a和变量b的值借助于变量tmp就完成了交换

代码如下(以a、b为整型变量为例):

#include<stdio.h>
int main()
{int a = 3;int b = 5;printf("交换前:a = %d; b = %d\n", a, b);int tmp = a;a = b;b = tmp;printf("交换后:a = %d; b = %d\n", a, b);return 0;
}

代码验证如下:


那不能创建临时变量又该如何交换两个变量的值呢,方法如下:

方法一:加减法

代码如下:

#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:先将a与b的和存放在a中

b = a - b:此时的a就为变量a、b的和,a减去b得到的就是a原来的值,然后赋值给b

a = a - b:此时的b为原来a的值,那么a减去b得到的就是原来b的值,最后赋值给a

这样就实现了变量a、b的交换

代码验证:

方法一的缺陷: 

当变量a的值和变量b的值近乎于整型能表达的最大值时

此时a加上b的值就超出了整型能表示的最大值,再赋值给a的话就会发生截断

从而就达不到交换的效果


方法二:异或操作符

异或操作符相关的知识请见:按位与、或、异或操作符-CSDN博客

代码如下:

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

异或操作符的相关运算

异或操作符运算规则:对应的二进制位相同为0,相异为1

a ^ a:得到的结果为0,因为对应的二进制位全相同

结论:任意整型变量自己异或自己时,得到的结果为0

a ^ 0:得到的结果为a

结论:任意整型变量异或0还是得本身

a ^ b ^ a:得到的结果为b

a ^ a ^ b:得到的结果为b

结论:异或操作符是支持交换律的

代码讲解:

由以上的结论即可推导出代码是如何实现的

a = a ^ b:将a ^ b存放在变量a中

b = a ^ b:此时的a为a ^ b,原代码可替换为:b = a ^ b ^ b,由以上结论就可得出b = a

a = a ^ b:此时的a还是为a ^ b,此时的b已经被赋值为了a,所以原代码可替换为:a = a ^ b ^ a,由以上结论就可得出a = b

代码验证:

方法二的优点: 

不论变量a或者b为多么大的值,都不会产生溢出或者截断的情况

因为使用异或操作符操作的是二进制位,且不会出现进位的情况


总结:

方法二的可读性不高,且不易理解

所以在常规实现两个变量的交换时,使用创建tmp变量进行交换即可


http://www.ppmy.cn/devtools/56289.html

相关文章

Lodash-js工具库

1. Lodash 简介 Lodash 是一个现代 实用工具库&#xff0c;提供了许多有用的函数&#xff0c;帮助开发者处理常见的编程任务&#xff0c;如数组操作、对象处理、字符串处理等。Lodash 使得代码更简洁、更高效&#xff0c;极大地提高了开发效率。Lodash 的设计灵感来自于 Under…

智能体时代:Agent开发的三重境界

❝ 在人工智能领域&#xff0c;Agent开发是一个不断演进的过程&#xff0c;它涉及到如何将AI技术与实际应用相结合&#xff0c;以提高效率、增强用户体验和推动业务发展。本文将探讨Agent开发的三个阶段&#xff0c;从基础的API使用到复杂的智能应用开发&#xff0c;逐步深入&a…

帝国cms未审核文章可视化预览效果

有时候为了让编辑更加清楚的看到别人审核之后的效果&#xff0c;同时文章有需要下一级审核才能在前端展示出来&#xff0c;今天就来展示一个未审核文章预览审核后的效果 这次给某出版社开发的时候&#xff0c;他们需要实现编辑能够预览自己发布之后的审核效果&#xff0c;所以就…

IIC学习笔记(立创STMF4开发板)

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff01;&#xff01;&#xff01; 个人学习笔记&#xff0c;参考文献&#xff0c;链接最后&#xff01;&#xff01;&#xff01; #I2C涉及相关知识 SDA串行数据线&#xff1a; Ser…

在Java中使用断言函数进行代码测试

在Java中使用断言函数进行代码测试 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Java中使用断言函数进行代码测试的方法和技巧。 什么是…

使用Token管理用户session

起因&#xff1a;单点登录问题&#xff0c;登录时访问的是tomcat1&#xff0c;访问获取用户数据时访问的是tomcat2&#xff0c;而用户的session信息在tomcat1上存储&#xff0c;tomcat2并不知道该用户来过&#xff0c;所以在获取个人信息时从session中获取不到数据&#xff0c;…

C++ 教程 - 07 类的静态成员

文章目录 静态成员 静态成员 使用static修饰的成员&#xff1b; 静态的成员变量&#xff1b; 仅保留一份副本&#xff0c;不管创建多少个实例对象&#xff0c;都共享这一份数据&#xff1b;类、对象均可以调用&#xff1b;类外重新声明&#xff0c;并通过类初始化&#xff1b;…

基于weixin小程序新生报到系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;班级信息管理&#xff0c;师资力量管理&#xff0c;宿舍信息管理&#xff0c;宿舍安排管理&#xff0c;签到信息管理&#xff0c;论坛管理 小程序功能包括&#xff1a;系统首页&a…