交换两个变量数值的3种方法

2024-09-07 22:20

本文主要是介绍交换两个变量数值的3种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:交换两个数值可不是"a = b,b = a"。这样做的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。

下面教给大家3种交换变量数值的方法:

目录

1. 中介法

2. 消和法

3. 异或法

4. 总结


1. 中介法

中介法(又称 临时变量法 或 酱油法),其中心思想是:

  • 使用一个额外的变量作为中介暂时保存其中一个变量的值,从而实现两个变量值的交换。(该临时变量的类型,是跟那两个要交换的变量的类型是一致的)

 关键步骤:(假如有整型变量 int a=2, b=3; )

1. int t = a;        /①创建临时变量t,②并把a的值交给t。  //此时,t等于2

2. a = b;            /③把b的值赋给a。          //此后,a的值成了b的初始值,即a等于3

3. b = t;             /④把t 的值赋给b。         //b的值变成了a的初始值,完成交换

代码演示:

int main()
{int a = 2, b = 3;//中介法int t = a;a = b;b = a; printf("中介法交换后:a=%d b=%d\n", a, b);return 0;
}

2. 消和法

消和法,其中心思想是:

  • 先用加法成和,再按顺序对和做减法得到对方的初始数值。

 关键步骤:(假如有整型变量 int a=2, b=3; )

1. a = a + b;    /①把加法成和的结果赋给a。        //此时a的值变成了a+b的初始值之和

2. b = a - b;     /②b先对和做减法得到a的初始值。 //从数值关系看,其实是b=(a+b)-b  

3. a = a - b;     /③a后对和做减法得到b的初始值。 //从数值关系看,其实是a=(a+b)-a 

为了让你们更好理解,我加入第3个变量:

1.   int t = a+b;

2.   b = t - b;

3.   a = t - a; 

代码演示:

int main()
{int a = 2, b = 3;//消和法a = a + b;b = a - b;a = a - b; printf("消和法交换后:a=%d b=%d", a, b);return 0;
}


消和法的数据溢出问题:

a和b都是int型,而int型的数值范围是 -2147483648 ~ 2147483647 ,如果a+b之和大于2147483647,那将会发生数据截断,导致数据丢失。

3. 异或法

其实我们还可以用按位异或操作符(^)来实现交换。(没学过按位异或的可以看一下这篇文章:进制数基础知识 与 位运算(基础版)-CSDN博客)

没学过也没关系,我们只需要知道这3条性质就行:(我们假设有一个整型变量a)

  • 按位异或满足交换律 和 结合律。
  •  a ^ a == 0
  •  a ^ 0 == a

异或法的中心思想:

  • 一个数与另一个数异或两次,结果仍然是原来的数

 关键步骤:(假如有整型变量 int a=2, b=3; )

1. a = a ^ b;   /①变量a存放两个初始值异或的结果

2. b = a ^ b;   /②b与第一次异或的结果异或,得到a的初始值     //即b=(a^b)^b

3. a = a ^ b;   /③a与第一次异或的结果异或,得到b的初始值     //即a=(a^b)^a

提示:(a^b)^b == a^b^b == a^0 == a

如果学过《进制数基础知识 与 位运算(基础版)》 的话,很容易知道异或法是不会数据溢出的。

代码演示:

int main()
{int a = 2, b = 3;//异或法a = a ^ b;b = a ^ b;a = a ^ b;printf("异或法交换后:a=%d b=%d\n", a, b);return 0;
}

4. 总结

中介法需要3个变量数据丢失
消和法需要2个变量可能数据丢失
异或法需要2个变量数据丢失

这篇关于交换两个变量数值的3种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146328

相关文章

Nginx 访问控制的多种方法

《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基... 目录一、IP 白名单与黑名单1. 允许/拒绝指定IP2. 全局黑名单二、基于路径、方法、参数的访问控制

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景