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

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

	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. 由浅入深--MyBatis系列

    从今天开始将要开始由浅入深--MyBatis系列博客的编写; 主要目录如下: MyBatis基础知识篇 1.由浅入深---ORM简介 2.由浅入深---MyBatis的整体架构 3.由浅入深---第一 ...

  2. 哈工大 NLP 实验一 汉语分词系统

    NLP实验代码可见github:NLP实验代码整理 本实验会查重,而且写起来难度比较大,建议早一些开始.实验报告要用顶会论文形式呈现,建议使用overleaf里的ACL论文latex模板比较方便一点.

  3. 【实测】Python 和 C++ 下字符串查找的速度对比

    完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...

  4. dependencies与devDependencies中应该放哪些依赖

    网上一般的解释都是,开发环境用devDependencies,生产环境用dependencies,说的很简明,但是这里有个问题是,哪些包需要放到devDependencies中,哪些包需要放到depe ...

  5. python+pytest接口自动化(6)-请求参数格式的确定

    我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...

  6. jQuery-ajax-天气接口

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. php jsonp接口

    //jsonp回调 $callback = isset($_GET['callback']) ? trim($_GET['callback']) : ''; //jsonp回调参数,必需 $cgc_k ...

  8. Sublime Text3中文环境设置

    Sublime Text3中文环境设置 1.首先打开安装好的的Sublime软件,选择Preferences下面的Package Contorol选项出现弹窗方框 2.在弹窗输入install pac ...

  9. tensorflow源码解析之framework-resource

    目录 什么是resource 如何使用resource 如何管理resource 常用resource 其它结构 关系图 涉及的文件 迭代记录 1. 什么是resource 我们知道,TF的计算是由设 ...

  10. 假设检验的python实现命令——Z检验、t检验、F检验

    Z检验 statsmodels.stats.weightstats.ztest() import statsmodels.stats.weightstats as sw 参数详解: x1:待检验数据集 ...