在研究两个整数互换的方法时(详细看这里),发现了一个有趣的现象。

a ^= b ^= a ^= b;      a ^= b;b ^= a;a ^= b;

有兴趣的童鞋可以看看下面代码的结果是什么:

int a = ;
int b = ;
a ^= b ^= a ^= b;
Console.WriteLine("{0} {1}", a, b);

一直以为a=b=c就是按照先后顺序执行b=c,a=b。照上面的执行结果来看,还不一定。

到底执行的顺序怎么样,要看看反编译的代码才知道。

先看看a=b=c=30都在做什么:

IL_0008:  ldc.i4.s    //推送30到栈顶端
IL_000a: dup //复制一个30到栈顶端
IL_000b: stloc.2 //提取顶端的30赋值给索引为2的变量,也就是c
IL_000c: dup //复制一个栈顶端的30
IL_000d: stloc.1 //提取顶端的30赋值给索引为1的变量,也就是b
IL_000e: stloc.0 //提取顶端的30赋值给索引为0的变量,也就是a

这样来看,a=b=c=30可以理解成c=30,b=30,a=30.

再看看a ^= b ^= a ^= b在做什么(初始化这里a=10,b=5):

IL_0006:  ldloc.0 //推送索引为0的变量值到栈顶端,也就是10
IL_0007: ldloc.1 //推送5
IL_0008: ldloc.0 //推送10
IL_0009: ldloc.1 //推送5
IL_000a: xor //提取10和5,做异或运算,将结果15推送到栈顶端
IL_000b: dup //复制15
IL_000c: stloc.0 //提取15赋值给a
IL_000d: xor //取顶端的两个值15和5,做异或运算,将结果10推送到栈顶端
IL_000e: dup //复制10
IL_000f: stloc.1 //提取10赋值给b
IL_0010: xor //取顶端的两个值10和10做异或运算,结果0放到栈顶端
IL_0011: stloc.0 //提取0赋值给a

做图解如下(作图水平不高,但应该勉强能看懂):

整个过程,用代码还原就是

    a1=a0^b0=15;

然后  b1=b0^a1=10;

再然后 a2=a0^b1=10^10=0。

前面两步的环节基本上是我们想要的,但是第三步a2=a0^b1却脱离了我们的原意,这里采用了a0做异或而不是a1,所以对应的结果也就出现了偏差。

因此,这一行代码执行下来,a=0,b=10,结果显然并不是我们想要的。

接下来,再看看a ^= b;b ^= a;a ^= b;在干嘛:

IL_0006:  ldloc.0  //推送10
IL_0007: ldloc.1 //推送5
IL_0008: xor //提取10和5做异或运算,得15,推送至栈顶
IL_0009: stloc.0 //将15赋值给a
IL_000a: ldloc.1 //推送b的值5
IL_000b: ldloc.0 //推送a的新值15
IL_000c: xor //提取15和5做异或运算,得10,推送至栈顶
IL_000d: stloc.1 //将10赋值给b
IL_000e: ldloc.0 //推送a的值15
IL_000f: ldloc.1 //推送b的新值10
IL_0010: xor //提取15和10做异或运算,得5,推送至栈顶
IL_0011: stloc.0 //将5赋值给a

整个过程比较清晰。中规中矩的异或计算然后赋值,再异或,再赋值,再异或赋值。最后a=5,b=10,结果和我们想的一样。

C#里面可以写连等句式,但是其中的逻辑一定要小心,尤其是连等过程中有变量赋值的,更要注意。平时使用的时候,建议不要为了省那两行的代码量而用连等语句拼凑,因为运算的结果可能和我们想要的不一样,而导致程序bug,得不偿失。

c# 连等算式都在做什么的更多相关文章

  1. 微信小程序来了,小程序都能做些什么

    2017年的微信大动作就是微信小程序了,到底小程序都能做些什么?这是很多人关注的热点,小程序开发对企业又有什么帮助呢?下面让厦门微信小程序开发公司来为你就分析下.       微信小程序与APP的关系 ...

  2. 腾讯QQ会员技术团队:人人都可以做深度学习应用:入门篇(下)

    四.经典入门demo:识别手写数字(MNIST) 常规的编程入门有"Hello world"程序,而深度学习的入门程序则是MNIST,一个识别28*28像素的图片中的手写数字的程序 ...

  3. 【腾讯Bugly干货分享】人人都可以做深度学习应用:入门篇

    导语 2016年,继虚拟现实(VR)之后,人工智能(AI)的概念全面进入大众的视野.谷歌,微软,IBM等科技巨头纷纷重点布局,AI 貌似将成为互联网的下一个风口. 很多开发同学,对人工智能非常感兴趣, ...

  4. Muduo学习笔记(一) 什么都不做的EventLoop

    Muduo学习笔记(一) 什么都不做的EventLoop EventLoop EventLoop的基本接口包括构造.析构.loop(). One Loop Per Thread 一个线程只有一个Eve ...

  5. 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活动结果时候 回调 是否被执行?

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活 ...

  6. WEB服务器都在做哪些工作?

    作为WEB开发人员,我们肯定应该要知道WEB服务器都在做哪些工作,这里简单列举一下,有时间然后详细说明. (1)建立连接——接受一个客户端连接. (2)接收请求——从网络中读取一条 HTTP 请求报文 ...

  7. 你们知道SEO每天都在做什么吗?

    医院也有做SEO的,专门负责医院网站优化工作,那么医院的SEO每天都做什么呢?偶然见到一篇文章,转载来分享给大家.感觉写的很实在. 大凡做seo工作的人都知道seo工作者每天都要做大量的外链,像有些个 ...

  8. 为什么工具类App,都要做一个社区?

    非著名程序员涩郎 非著名程序员,字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!个人微信号:loonggg,微博:涩郎,专注于移动互联网的开发和研究,本号致力于分享IT技术和程序猿 ...

  9. NodeJS什么都能做,为什么还要JAVA?

    这张图看起来简单而且很好理解,但没尝试过,会有很多疑问. SPA模式中,后端已供了所需的数据接口,view前端已经可以控制,为什么要多加NodeJS这一层? 多加一层,性能怎么样? 多加一层,前端的工 ...

随机推荐

  1. 关于 f 散度

    在概率统计中,f散度是一个函数,这个函数用来衡量两个概率密度p和q的区别,也就是衡量这两个分布多么的相同或者不同. 1.f散度的定义p和q是同一个空间中的两个概率密度函数,它们之间的f散度可以用如下方 ...

  2. Appium 设置手机连接方式

    使用appium的 Connection 和driver 的setConnection方法,可以切换手机的上网方式 // 切换到wifi Connection cnn = Connection.WIF ...

  3. linux 免密码登录

    linux 免密码登录 配置 test 为本地linux 192.168.1.70 为远程linux [root@test:/home/root]$ssh-keygenGenerating publi ...

  4. 四、s3c2440 裸机开发 通用异步收发器UARN

    四.通用异步收发器UARN 原文地址 http://blog.csdn.net/woshidahuaidan2011/article/details/51137047 by jaosn Email: ...

  5. Unity5 BakeGI(Mixed Lighting)小记

    1.模型需勾选Generate Lightmap UVs,否则烘培图像撕裂. 2.关于为何新版的改叫Mixed Lighting,猜测是之前属于全部烘培,现在算是部分烘培,实时阴影和烘培阴影可以混用, ...

  6. asp.net core在linux上的部署调试

    双十一买了阿里云的LINUX服务器三年¥720 把自己的niunan.net一系列网站都部署上去 用jexus来部署,部署时发现头一个网站没问题,但是后一个网站部署就有问题..输入域名打不开,但JEX ...

  7. 如何从angular2中的url获取查询参数?

    问题描述 我使用angular2.0.0-beta.7.当组件在像”/path?query=value1″这样的路径上加载时,它被重定向到”/path”.为什么删除了GET参数?如何保留参数? 路由器 ...

  8. 菜鸟学Java(九)——Servlet的基本配置

    学习JavaWeb的人没有不知道Servlet的吧,而要用Servlet就需要在web.xml中进行配置.相信有很多初学者跟我当初一样,对于一些配置参数不是很理解,今天就说说Servlet最基本的配置 ...

  9. [Windows Azure] How to Scale a SQL Database Solution

    How to Scale a SQL Database Solution On Windows Azure, database scalability is synonymous with scale ...

  10. (原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架

    c++11 boost技术交流群:296561497,欢迎大家来交流技术. 本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里.我前面的博文 ...