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

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

	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. spark conf的3种配置优先级

    在SparkConf上设置的属性具有最高的优先级,其次是传递给spark-submit或者spark-shell的属性值,最后是spark-defaults.conf文件中的属性值

  2. 哈工大 计算机网络 实验一 HTTP 代理服务器的设计与实现

    计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 HTTP 代理服务器的设计与实现 实验目的: 熟悉并掌握 Socket 网络编程的过程与技术:深入理解 HTTP 协议, 掌握 ...

  3. lsof、tcpdump和wireshark

    lsof:https://www.jianshu.com/p/a3aa6b01b2e1 tcpdump:https://linux.cn/article-10191-1.html wireshark: ...

  4. JZ-055-链表中环的入口结点

    链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目链接: 链表中环的入口结点 代码 import java.util.ArrayList; ...

  5. jquery, js轮播图插件Swiper3

    轮播图插件Swiper3 HTML代码 如果只是简单的使用轮播图,直接复制我的html代码就可以. 如果想要高级一些,就自己去看文档吧 <!DOCTYPE html> <html l ...

  6. 编写Python代码的注意事项

    1.标识符 标识符是定义的名称,包括类名.变量名等等 标识符的大小写是敏感的,且第一个字符必须是字母表中的字母或"_" 在python3中,中文可被用作变量名 不能使用Python ...

  7. 【数据结构与算法】Trie(前缀树)模板和例题

    Trie 树的模板 Trie 树的简介 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.他的核心思想是空间换 ...

  8. oracle 中有数据但是sql查询不出来结果(中文)

    如 select * from user where name like '%王%': 无数据: 而数据库中确实有姓王的用户. 配置环境变量 NLS_LANG = AMERICAN_AMERICA.A ...

  9. Gradle Gretty进行runAppDebug的Listening for transport dt_socket at address: 5005 的后续配置

    出现 Listening for transport dt_socket at address: 5005:代表debug端口已启动好了,接下来你需要进行配置远程Debug,进行附加Debug进程: ...

  10. mybatis学习一:基于xml与注解配置入门实例与问题

    注:本case参考自:http://www.cnblogs.com/ysocean/p/7277545.html 一:Mybatis的介绍: MyBatis 本是apache的一个开源项目iBatis ...