首页 > 其他分享 >不能创建第三个变量,实现两个数的交换

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

时间:2024-06-30 18:56:29浏览次数:3  
标签:tmp 变量 int 创建 交换 第三个 异或 操作符

目录

常规实现两个数的交换(如:交换变量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变量进行交换即可

标签:tmp,变量,int,创建,交换,第三个,异或,操作符
From: https://blog.csdn.net/weixin_55341642/article/details/140041273

相关文章

  • 不会你打我!使用AI绘画Stable Diffusion或Midjourney创建你的专属表情包!附完整详细教程
    大家好,我是向阳相信大家对微信表情包一定非常熟悉了,可能每天都在使用别人的表情包。那么有没有想过制作自己的专属表情包呢?那您可能觉得我又不会设计,怎么制作呢?没关系,虽然不会设计,但是我们可以简单地使用一些AI辅助。不是也上架了自己制作的表情包~今天将自己通过AI制作......
  • Java创建List的4种方法
    1、通过构造方法,例如:List<String>list=newArrayList<>();然后调用list.add增加元素,如果知道初始化的值,这种先构造再一项项添加的方式,用起来并不爽,于是一边都用下面的方法2、通过Arrays.asList("a","b");但是这种方法构造出的List是固定长度的,如果调用add方法增加新的元素,......
  • JavaScript第十二讲:DOM编程“创建,删除,替换,插入节点”
    目录1.创建节点2.删除节点3.替换节点4.插入节点使用appendChild()使用insertBefore()深入解析与注意事项1.创建节点在HTMLDOM中,我们通常使用JavaScript的document.createElement()方法来创建元素节点,使用document.createTextNode()方法来创建文本节点。示例......
  • STM32CubeMX 创建 MDK 工程
    STM32CubeMX创建MDK工程MDK(KeiluVision)MDK(KeiluVision)是Arm公司开发的一款集成开发环境(IDE),专门用于Arm架构的嵌入式系统开发。它提供了全面的功能,包括:代码编辑器,支持语法高亮、代码补全和错误检测调试器,支持单步执行、断点和变量监视汇编器和链接器,......
  • python创建websocket服务器,实现循环发送消息
    WebSocket协议是在2008年由Web应用程序设计师和开发人员创建的,目的是为了在Web浏览器和服务器之间提供更高效、更低延迟的双向通信。它允许客户端和服务器在任何时候发送消息,无需重新建立TCP连接。WebSocket可以在Web浏览器和服务器之间传输文本和二进制数据,使得构建实时Web......
  • PixiJS教程(一):创建精灵
    Pixi.js中的精灵(Sprite)是游戏开发中常见的概念,特指用于在屏幕上渲染的图像或纹理(Texture)的实例。在Pixi.js中,精灵是基本元素之一,通常用于显示图像。本教程采用PixiJS7.2版本精灵在Pixi.js中的使用涉及以下几个主要步骤:创建精灵创建精灵的方法有多种,这里展示比较常用的con......
  • 【Gradio】Chatbot | 如何使用 Gradio Blocks 创建自定义聊天机器人
    简介重要提示:如果您刚开始接触,我们建议使用 gr.ChatInterface 来创建聊天机器人——它是一个高级抽象,使得可以快速创建漂亮的聊天机器人应用程序,往往只需一行代码。在这里了解更多信息。本教程将展示如何使用Gradio的低级BlocksAPI从头开始制作聊天机器人UI。这将使......
  • mysql 如何分配root账号创建数据库的权限
    1.mysql如何分配root账号创建数据库的权限在MySQL中,root用户通常具有所有的权限,包括创建数据库的权限。但是,如果我们想要为另一个用户分配创建数据库的权限,或者想要限制root用户对某个特定数据库或服务器的权限(尽管这在实际操作中并不常见,因为root用户通常应该是无限制的......
  • mysql 如何分配root账号创建数据库的权限
    1.mysql如何分配root账号创建数据库的权限在MySQL中,root用户通常具有所有的权限,包括创建数据库的权限。但是,如果我们想要为另一个用户分配创建数据库的权限,或者想要限制root用户对某个特定数据库或服务器的权限(尽管这在实际操作中并不常见,因为root用户通常应该是无限......
  • pyqt5创建主窗口(介绍窗口类型)
    创建主窗口(介绍窗口类型)我们用QMainWindow主窗口代码来创建UIQMainWindow.setWindowTitle(字符串),设置窗口标题QMainWindow.resize(800,400),设置窗口尺寸QMainWindow.statusBar(),获取状态栏对象QMainWindow.showMessage('停留5秒消息',5000)QApplication.setWindowIcon(QIco......