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

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

	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. 查看oracle归档日志路径

    转至:https://blog.csdn.net/u010098331/article/details/50729896/ 查看oracle归档日志路径 1.修改归档日志的格式 默认格式是:" ...

  2. vue初步构建项目

    新建项目文件夹 在当前文件夹打开命令行工具(shift+右键-->在次此处打开命令窗口) npm install -g vue-cli npm init webpack npm install ...

  3. List分组和排序

    1 //分组 2 var ll= lst.GroupBy(x => new { x.Id, x.Name }).Select(x => new 3 { 4 Key = x.Key, 5 I ...

  4. jmeter + tomcat + ant + svn +jenkins 实现持续集成测试

    l 安装jdk时候需要提前检查jdk是否安装成功 l 在dos下输入javac      java -version l l 安装jmeter l 校验是否安装成功: l 进入jmeter目录下bin ...

  5. 矩池云升级JupyterLab版本教程

    先使用 Xshell 连接矩池云 GPU服务器,可以查看教程. 要在base环境下执行,用下面命令 conda deactivate ps -aux | grep jupyter 我这个进程是616 ...

  6. SQL注入 - SQLi-Labs靶场过关记录

    Less-1 1.看报错类型,确定注入点 ?id=1' order by 4--++ 2.确定数据库 ?id=-1' union select 1,2,3--++ 3.查看数据库 ?id=-1' un ...

  7. PHP 开发者如何做好密码保护 & Laravel 底层密码存储和验证实现

    随着在线攻击的增多,密码安全越来越重要.作为开发者我们要担负起安全管理.计算哈希和存储用户密码的责任,不管应用是简单的游戏还是绝密商业文件的仓库,都要做到这一点.PHP内置了一些工具,让保护密码变得更 ...

  8. Java入土---Java基础(一)

    注释,标识符,关键字 注释类似于我们的随手记,并且不会被执行,是写给我们自己看的,书写注释是一个非常好的习惯 重点来了,Java中注释有三种:单行注释,多行注释,文档注释 单行注释 "//& ...

  9. java面试:多线程

    1.多线程 ​ 同步:发送一个指令需要等待返回才能发送下一条(完成一件事才能做下一件). ​ 异步:发送一个请求不需要等待返回,随时可以再发下一条(一次进行多个事件) 线程不安全根本原因是异步,对一个 ...

  10. pandas常用操作详解(复制别人的)——数据透视表操作:pivot_table()

    原文链接:https://www.cnblogs.com/Yanjy-OnlyOne/p/11195621.html 一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表 ...