c# 连等算式都在做什么

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

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

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

int a = 10;
int b = 5;
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 //推送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,得不偿失。

时间: 2024-11-10 13:36:48

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

作为一个前端工程师,CSS是最基本的入门课,你都能做出来吗?

CSS在很多程序员看来那只不过是雕虫小技, 实际上CSS3发展到今天已经强大到超乎你的想象, 当然对于低端浏览器使用者来说,还是以前那样——囧 有时候搞CSS开发确实需要很多想象力,下面一组纯CSS3特效足以描述这一点 以下内容转载自[http://design.yesky.com/show/466/11497966_3.shtml] 设计欣赏:纯CSS3「绘制」的图形图标 IE 标志 作者: Andreas Jacob 在 Firefox 3.6+ 以及Safari 5 上显示最佳.使用了圆角

Java千百问_01基本概念(004)_Java都能做些什么

点击进入_更多_Java千百问 1.Java都能做些什么 在讨论Java能干什么之前,我们要说一下软件系统的体系结构. 你不知道Java是什么?请看这里:什么是Java 2.什么是纯C架构系统 完全脱离网络就可独立使用的软件系统(即客户端C,client),这类软件不受限于网络,只依赖于操作系统. 如:PC上的word.视频播放器等软件. 3.什么是C/S架构系统 拥有自己独立的一个或多个服务端系统(即服务端S,server),每个使用者拥有自己独立的客户端软件(即C,client),客户端与服

seo都是唬人的,不就是发发文章和外链嘛,是人都能做。

我的同事说:seo都是唬人的,不就是发发文章和外链嘛,是人都能做.看到这样的文字后,心里小纠结了一下,不过我还是想说两句,发文章和发外链只是过是SEO里面的一种,由外链专员和编辑来完成,但也不能小看这两个职位,下面我来讲讲我个人的观点1.文章也分原创和非原创吧,发文章也有以下几个步骤:1.1软文素材查找1.2 软文提纲1.3 软文编辑1.4 软文审核1.5 软文发布&统计1.6 软文效果追踪现在搜索引擎都喜欢原创的文章,喜欢新鲜的血液,你到处转载的文章对你网站SEO而言有用吗?搜索引擎会给你收录

谋哥:App都应该做减法!

[谋哥每天一干货,第七十四篇] 昨天刚写马云,今天就被WTB(乌托邦)三位大佬抢了头条!王健林是非常有魄力的,刚跟马云赌,知道要输,立马反思自己,开始投身互联网!这执行力太牛了.我在这里批评一下那些要加入谋天团,然后各种犹豫的人,考虑来考虑去,世界早变了,剩给你的是残羹冷饭!现在是做App创业,自媒体创业最佳的时机. 你当然可以自己折腾了,我不拦你,只要你够强,觉得自己能够所向披靡,那我也佩服你.问题就是你自己干不行,各种经验你没有,还老被骗,到我自己诉苦!诉苦有毛用.花10多万买一个SB的Ap

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

非著名程序猿涩郎 非著名程序员,字耿左直右,号涩郎.爱搞机,爱编程,是爬行在移动互联网中的一名码匠! 个人微信号:loonggg,微博:涩郎.专注于移动互联网的开发和研究.本号致力于分享IT技术和程序员工作心得体会. 欢迎大家关注与转载. 为什么工具类App.都要做一个社区? 非著名程序猿 移动互联网的蓬勃发展,以至于应用市场上App数以亿计.工具类App甚多,那天我在知乎上看到了一个问题,那就是:为什么工具类App.无论实用没用,都喜欢加上一个社区呢?当然以下的回答也是五花八门. 并且他们答的

你真的知道自己每天都需要做什么吗?

文/黑天鹅图书 你真的知道自己每天都需要做什么吗?如果你觉得一天8小时不够用,很有可能是你没有把时间用在重要的地方上.现在开始列一张清单吧,让你的一天过得更加轻松高效. 工作清单让职场更高效 列出一张目标清晰的工作清单 事实上,在工作中,大多数人都会感到时间不够用.尽管时间管理的重要性每个参与工作的人们都非常清楚,但是,还是有很多人没有办法在8小时内妥善处理好自己的工作. 人们找到的最心安理得的借口是:不是我偷懒,不努力工作,而是因为工作负荷太重,工作时间却不够用.他们会抱怨说,一天就24个小时

人人都能做产品经理吗?

作为一个创业者来说,特别是主导创业项目的创始人,你首先必须是一个优秀的产品经理,能够始终牢牢掌控自己的创业产品的发展.我将通过一系列文章探讨,如何做一个优秀的产品经理. 阿里巴巴的产品经理苏杰写了一本非常火的书,叫做「人人都是产品经理」,介绍产品经理的思维方法,并且在生活的方方面面都可以运用产品经理的思维解决问题.这本书对于提高人们普遍意义的思考能力有一定的帮助,但是对于真正在互联网行业从事专业的产品经理岗位的人来说是有害的,并不是人人都能够做专业的产品经理. 一个多月前在EGO的活动上,我和达

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

作为WEB开发人员,我们肯定应该要知道WEB服务器都在做哪些工作,这里简单列举一下,有时间然后详细说明. (1)建立连接——接受一个客户端连接. (2)接收请求——从网络中读取一条 HTTP 请求报文. (3)处理请求——对请求报文进行解释,并采取行动(上面程序未实现). (4)访问资源——访问报文中指定的资源(上面程序未实现). (5)构建响应——创建带有正确首部的HTTP 响应报文. (6)发送响应——将响应回送给客户端. (7)记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件

作为一名SEOer 每天都要做些什么?

作为一个合格的SEOer每天都要做些什么?是每一个刚入门的SEO很困惑的问题,同时也说明我们还没有对SEO正式的了解.要想做一个合格的SEOer就必须做一个详细的SEO计划,并以文档或笔记的形式保存下来,以便于以后多工作的总结和SEO知识的提高.制定计划,并且按照计划去进行推进工作,只有这样我们才可能达到预期的效果或者说才能按时完成计划. 今天先解决的问题是:作为一个合格的SEOER每天需要做些什么?首先在学习过程中进行总结,将学习过程中的问题记录下来,许找答案,从而提高自己.养成一种学习.实践