今天腊月二十九啦,无心上班,专注划水.然后就在那里翻帖子消磨时光.

  看到了这样一个问题,有人提问为什么   a=b+(b=a)*0 

  ???

  第一眼看上去,我也有点蒙,仔细推敲了一下,嗯~的确是交换了值

  先把这个等式为什么能交换值先搁置一下,先来总结一下目前我所知道的

两个变量进行值交换有哪些方式?


  第一种方式也是最常用的方式:通过中间变量

    int a = 1;
int b = 2; int temp = a;
a = b;
b = temp;

  第二种方式:通过数学运算

    int a = 1;
int b = 2; a = a + b;
b = a - b;
a = a - b;

  

  第三种方式:异或运算

  int a = 1;
  int b = 2;   a = a ^ b; //第一步 001 a值为1 第二步 011 a值为3 第三步 011 a值为3
  b = a ^ b; //异或操作 010 b值为2 异或操作 010 b值为2 异或操作 001 b值为1
  a = a ^ b; //得到 011 值为3 得到 001 值为1 得到 010 值为2
//这时候a的值为3  这时候b的值为1 这时候a的值为1
  

  这样三步异步操作就完成了换值操作 这也是目前我所知的,不借助中间变量,速度最快的换值,因为异或的运算是位运算,二进制运算

  

  第四种方式在C# 7.0 中可以使用元组(Tuple)类

    int a = 1;
int b = 2; (a, b) = (b, a)

  这种方式以我的理解 他就像是 new 一个新对象 然后把新对象赋值给旧对象

  像这样 

    public class ClassDemo
{
private int a;
private int b; public int A { get => a; set => a = value; }
public int B { get => b; set => b = value; }
public override string ToString()
{
return "A的值为" + A + " B的值为" + B;
}
}
 static void Main(string[] args)
{ ClassDemo oldOBj = new ClassDemo() { A = 1, B = 2 };
Console.WriteLine("旧对象: " + oldOBj.ToString()); ClassDemo newObj = new ClassDemo() { A = 2, B = 1 };
oldOBj = newObj; Console.WriteLine("旧对象: " + oldOBj.ToString());
Console.ReadLine();
}

  如果实在不明白(a, b) = (b, a)  这行代码到底什么意思,来看一下反编译之后他是什么样子

  这里用IL Spy反编译一下这个控制台程序,如图:

  

  可以看到(a, b) = (b, a)这个操作多出来了两个变量

  所以说利用元组的这个特性去做值交换时,虽然目的可以达到,但是浪费资源
  
 好了,总结到此为止,上我今天最开始的问题,为什么  a=b+(b=a)*0   能达到交换值的操作?


  来分析一下:

  这个能交换值当然是因为优先级啦 我们还是先假设

  a=1,b=2;

  首先,肯定要先算等式右边的,右有又加号,有括号,有乘号, 有等号 那优先级肯定是括号 -> 乘号 -> 然后加号 最后赋值

  我看到第一眼是这样推理的

   (b=a)先执行 此时b=1  ->   等式右边就是  1+0   ->   然后给a赋值   ->   则结果时a=1,b=1

  运行一下代码,结果:

  所以我说我第一眼看去有点懵,这是什么操作,Why???

 后来,仔细推敲了一下,被自己的愚蠢逗笑了,原来是受到了我亲爱的小学老师先乘除后加减的影响,第一眼看上去就先算乘除去了,实际应该这样推理:

  等式右边分两部分b和(b=a)*0做加法  ->  从左往右计算a=2+(b=a)*0  ->  右半部分(b=a)先执行 此时b=1  ->   等式右边就是  2+0   ->   然后给a赋值   ->   则结果时a=2,b=1  ->换值完成

  

  记录一下自己愚蠢的一天.文章中有错误之处希望大佬们不吝赐教,感谢

c#记两个变量进行值交换的更多相关文章

  1. JavaScript两个变量的值交换的多种方式

    前言 该文是在看别人博客的时候发现的,很有趣的一篇文章,这里摘录到自己的简书中,供给各位读者学习本文主要描述,如何不使用中间值,将两个变量的值进行交换.前三种只适用于number类型的数值交换,第四和 ...

  2. python不使用第三方变量,交换两个变量的值

    #不使用第三个变量交换两个变量的值 a=1 b=2 a,b=b,a#python的直接交换 #另一种交换方法 a=a+b#a=3 b=2 b=a-b#a=3 b=1 a=a-b#a=2 b=1 pri ...

  3. C语言:指针实现交换两个变量的值

    用指针交换两个变量的值(10分) 题目内容: 用指针交换两个变量的值 主函数参考: int main( ) { int a,b; scanf("%d%d",&a,& ...

  4. Python两个变量的值进行交换的方法

    Python两个变量的值进行交换的方法 使用第三方变量: '''这是第一种赋值方法,采用第三方变量''' c = a a = b b = c 使用两个变量: '''使用两个变量''' a = a+b ...

  5. JAVA交换两个变量的值-(不使用第三变量)

    以下方法的根本原理就是: 借助第三个变量 c = a; a = b; b = c; 运算符-不借助第三变量: a = a+b; b = a-b; a = a-b; 为运算符-不借助第三个变量: (此种 ...

  6. 【剑指offer】不使用新变量,交换两个变量的值,C++实现

    # 题目 不使用新变量,交换两个变量的值. # 思路 方法一:使用加减法操作,交换两个变量的值. A = A+B B = A-B A = A-B 方法二:使用异或运算,交换两个变量的值 A = A^B ...

  7. PHP中不用第三个变量交换两个变量的值

    相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方 ...

  8. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

  9. JS基础语法---练习:交换两个变量的值

    * JavaScript简称为JS * JavaScript是什么?     * 是一门脚本语言:不需要编译,直接运行     * 是一门解释性的语言:遇到一样代码就解释一行代码     * C#语言 ...

随机推荐

  1. ctfhub技能树—文件上传—无验证

    打开靶机 查看页面信息 编写一句话木马 <?php echo "123"; @eval(@$_POST['a']); ?> 上传木马 上传成功,并拿到相对路径地址 查看 ...

  2. SVM 支持向量机算法-原理篇

    公号:码农充电站pro 主页:https://codeshellme.github.io 本篇来介绍SVM 算法,它的英文全称是 Support Vector Machine,中文翻译为支持向量机. ...

  3. Pulsar vs Kafka,CTO 如何抉择?

    本文作者为 jesse-anderson.内容由 StreamNative 翻译并整理. 以三个实际使用场景为例,从 CTO 的视角出发,在技术等方面对比 Kafka 和 Pulsar. 阅读本文需要 ...

  4. MySQL全面瓦解19:游标相关

    定义 我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标. 所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库 ...

  5. 同一份数据,Redis为什么要存两次

    前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么要这么做呢?这么做会造成同一份数据占用两倍空间吗? 五种基本类型之集合对象 Red ...

  6. 对 js加密数据进行爬取和解密

    对 js加密数据进行爬取和解密 分析: 爬取的数据是动态加载 并且我们进行了抓包工具的全局搜索,没有查找到结果 意味着:爬取的数据从服务端请求到的是加密的密文数据 页面每10s刷新一次,刷新后发现数据 ...

  7. 转 Jmeter测试实践:文件下载接口

    Jmeter测试实践:文件下载接口   一 Jmeter步骤 1.打开jmeter4.0,新建测试计划,添加线程组.根据实际情况配置线程属性. 2.添加HTTP请求.根据接口文档进行配置. Basic ...

  8. STP 根桥、根端口、指定端口是如何选举的

    学习HCIA过程中,对交换机的根桥.跟端口以及指定端口选举有些迷糊,也度娘了一番,总觉得一部分人解释的不够全面精细.通过仔细研究最终有了自己的理解,分享给大家,如果纰漏,欢迎指正. STP收敛过程: ...

  9. 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

    不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK 报错图示: 报错内容: Exception in thread "main" java.sql.SQ ...

  10. py, pyc, pyw, pyo, pyd Compiled Python File (.pyc) 和Java或.NET相比,Python的Virtual Machine距离真实机器的距离更远

    https://my.oschina.net/renwofei423/blog/17404 1.      PyCodeObject与Pyc文件 通常认为,Python是一种解释性的语言,但是这种说法 ...