实现变量的值互相交换的三种不同方法

方法一:利用第三个变量来实现数值的交换

	int tmp;
tmp = a;
a = b;
b = tmp;

此方法直观,简易。不易出错,推荐使用

方法二:利用两个变量间的加减运算实现数值的交换

    a=a+b;
b=a-b;
a=a-b; //a=a-b;
//b=a+b;
//a=b-a;

注:在某些运算中会出现bug,不建议使用

方法三:利用按位异或运算实现数值的交换

    a=a^b;//bug,自身异或为0
b=a^b;
a=a^b;

注:同样的在某些运算中会出现bug,不建议使用

需要注意的是后两种方法在某些情况下会产生bug,所以建议用第一种方法

完整代码:

编写为函数时

C语言中用指针 void Swap(int *p1,int *p2);

c++中可用引用的方式 void Swap(const int &p1,const int &p2);

#include<stdio.h>

void Swap1(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
} void Swap2(int *p1,int *p2)
{
*p1=*p1-*p2;
*p2=*p1+*p2;
*p1=*p2-*p1;
} void Swap3(int *p1,int *p2)
{
*p1=*p1^*p2;
*p2=*p1^*p2;
*p1=*p1^*p2;
} int main()
{
int a = 10;
int b = 20;//测试用例 Swap1(&a,&b);
//Swap2(&a,&b);
//Swap3(&a,&b); printf("%d %d",a,b); return 0;
}

方法二、三存在bug,在某些情况下会出错,比如:

#include<stdio.h>

void Swap1(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
} void Swap2(int *p1,int *p2)
{
*p1=*p1-*p2;
*p2=*p1+*p2;
*p1=*p2-*p1;
} void Swap3(int *p1,int *p2)//bug 测试
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
} void Rerverse1(int *arr,int len)//数组逆置,用方法一
{
for(int i=0;i<=len/2;i++)
{
Swap1(&arr[i],&arr[len-1-i]);
}
}
void Rerverse2(int *arr,int len)//数组逆置,用方法二
{
for(int i=0;i<=len/2;i++)
{
Swap2(&arr[i],&arr[len-1-i]);
}
}
void Rerverse3(int *arr,int len)//数组逆置,用方法三
{
for(int i=0;i<=len/2;i++)
{
Swap3(&arr[i],&arr[len-1-i]);
}
} void Show(int *arr,int len)//打印函数
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
} int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
Rerverse1(arr,sizeof(arr)/sizeof(arr[0]));//用方法一
Show(arr,sizeof(arr)/sizeof(arr[0]));//打印逆置后的数组 int brr[] = {1,2,3,4,5,6,7,8,9};
Rerverse2(brr,sizeof(brr)/sizeof(brr[0]));//用方法二
Show(brr,sizeof(brr)/sizeof(brr[0]));//打印逆置后的数组 int crr[] = {1,2,3,4,5,6,7,8,9};
Rerverse3(crr,sizeof(crr)/sizeof(crr[0]));//用方法三
Show(crr,sizeof(crr)/sizeof(crr[0]));//打印逆置后的数组 return 0;
}

输出结果为

9 8 7 6 5 4 3 2 1

9 8 7 6 0 4 3 2 1

9 8 7 6 0 4 3 2 1

其中方法二与方法三都出了bug,所以建议使用方法一进行两数间的交换

c语言实现两数交换的三种方法的更多相关文章

  1. 实验02——java两个数交换的三种解决方案

    package cn.tedu.demo;/** * @author 赵瑞鑫      E-mail:1922250303@qq.com * @version 1.0* @创建时间:2020年7月16 ...

  2. JS变量和变量交换的三种方法

    一.what 变量就是用来存储数据的容器 二.how 通过var 关键字定义一个变量 var n1; //定义变量 变量的赋值:通过赋值运算符“=” 给变量赋值. var n2=123; //定义变量 ...

  3. 在C语言中不使用任何中间变量如何将a、b的值进行交换(三种方法)——来自一小萌新工程师的复习

    今天面试嵌入式,突然遇到这么一道题目,虽然简单,但鉴于我答得不是很好,所以还是分析一下为好. 第一种方法: 通过加减法. #include"stdio.h" int main(vo ...

  4. Python 文件行数读取的三种方法

    Python三种文件行数读取的方法: #文件比较小 count = len(open(r"d:\lines_test.txt",'rU').readlines()) print c ...

  5. java交换两个值的三种方法 经典

    1.中间变量(在开发中常用) int c=a; a=b; b=c; System.out.println("a的值: "+a+" b的值: "+b); 2.按位 ...

  6. go语言中获取变量类型的三种方法

    package main import ( "fmt" "reflect" ) func main() { var num float64 = 3.14 // ...

  7. C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)

    编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...

  8. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

  9. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

随机推荐

  1. Java课程设计---修改学生基本信息

    1.修改窗体 2.在StudentDao中增加修改学生信息的方法 /** * 修改的方法 * * @param student * @return * @throws SQLException */ ...

  2. 量化研究之“大A打板敢死队”是如何做换手板与撬板的?

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 涨停跌停板分类 涨停.跌停是A股特有的现象,其他主要市场,例如美股.港股都不存在涨跌停的规则.涨停.跌停 ...

  3. 我对maptask 和 reducetask的理解

    MapTask: 首先经过 FileInputFormat 判断该文件是否要进行切片,如果是我们自定义的FileInputFormat基本上重写isSplit方法返回为false表示不进行切片,那么就 ...

  4. 矩池云上安装yolov4 darknet教程

    这里我是用PyTorch 1.8.1来安装的 拉取仓库 官方仓库 git clone https://github.com/AlexeyAB/darknet 镜像仓库 git clone https: ...

  5. cmd 连接宝塔终端

  6. php 数组相关的函数?

    array()----创建数组array_combine()----通过合并两个数组来创建一个新数组range()----创建并返回一个包含指定范围的元素的数组compact()----建立一个数组a ...

  7. Vue的mvvm模式

    传统的MVC模式: Model:模型-->负责数据存储 View:视图-->负责页面展示 Control:控制器-->事件交互(根据视图与用户交互后改变数据) Vue的MVVM模式: ...

  8. 解析ansible远程管理客户端【win终端为例】

    一.前提: 1.1.windows机器开启winrm服务,并设置成允许远程连接状态 具体操作命令如下 set-executionpolicy remotesigned winrm quickconfi ...

  9. 空顺序表的实现(基于c语言)

    书中对于创建一个空线性表的定义如下: struct SeqList{ int MAXNUM; // 顺序表中最大元素的个数(也就是最多多少个元素),(其实MAXNUM也可以定义在外面) int n; ...

  10. 发现Compound的第二个严重漏洞

    本文转自 发现Compound的第二个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn) 这个漏洞原作者在2022年02月23日已经发布过,由于内容比较敏感,发布 ...