惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - LutzMark

charles4抓https请求的注意事项,补充iphone7(ios10系统)无法解密ssl问题 XCode设置自己windows习惯的快捷键(比如Home、End键) MVC项目中ExecutionTimeout不生效的解决方案 Delegate与Event的区别 坑爹的MSN登录错误80072745 Linq的sum函数InvalidOperationException异常解决办法 LINQ to SQL自定义映射表关系(1:N or 1:1) LINQ to SQL 外键约束的插入及获取主表标识列等问题 Flex中的 for in 与 for each in - LutzMark Flex的DataGrid将水平分隔线设为虚线 - LutzMark - 博客园 解决Flex的DataGrid控件中ItemRender随Scrollbar的滚动发生UI重绘问题 - LutzMark - 博客园 去除ColumnChart自带的阴影效果 - LutzMark - 博客园 IIS7中配置WebOrb支持RTMPT 使用DataAdpater自动批量更新DataSet中的数据到数据库 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke(转-因为写得很好) 控制台测试异步委托 一篇好文,以在迷茫时阅读 驳《IT开发工程师的悲哀》 钢板与表针
不用临时变量,只用11个字符交换两个变量的值——窥视C#编译原理的冰山一角
LutzMark · 2007-12-14 · via 博客园 - LutzMark

 曾经有一道题,已知:  
  int   a,   b;  
  并已赋值,值的唯一限制是int.MinValue<=a,b<=int.MaxValue,所有极端情况均有可能  
  例如   a   =   2147483647,   b   =   2147000000  
  又或   a   =   -2147483600,   b   =   -2147483640  
  又或   a   =   2000000000,   b   =   -2000000000  
  当然也包括   a   =   0,   b   =   0   (-_-)  
   
  现在要将a,b的值交换  
   
  没有任何导入的命名空间(即如果你要用类,必须从System开始写起)  
  没有任何辅助的方法(即如果你要辅助方法,你要自己写)  
  除了a和b没有其它已经声明的字段或参数或局部变量,  
   
  并且不能再声明任何变量!  
   
  求最短的、编译可以通过的、所有情况下都能达到目的的   C#   代码   
    
   用来测试的代码:  
  class   Program  
  {  
          static   void   Main()  
          {  
                  int   a   =   1234567890,   b   =   987654321;  
                  /**************************\  
                    *   将你的答案填入下面两个斜杠内   *  
                    *//*  
                    *   将你的答案填入上面两个斜杠内   *  
                  \**************************/  
                  System.Console.WriteLine("a={0},b={1}",   a,   b);  
                  System.Console.ReadLine();  
          }  
  }  

正确的解法是:
a   =   b   +   (   b   =   a   )   *   0

编译原理:
首先编译器根据运算符优先级,先找到这个里面最优先的运算符*,确定结合顺序如下:
a   =   (   b   +   (   (   b   =   a   )   *   0   )   )

接下来,根据C#规范,会从左至右计算每个子表达式的值,第一个子表达式b,值为当前b值,记为b &apos;,第二个子表达式b   =   a,值为当前a值,记为a &apos;,最后一个表达式0,值为0。

接下来,根据刚才确定的顺序,依次进行计算。
b   =   a已经运算完毕,值为a &apos;,这时进行乘法运算,然后进行加法运算,然而C#的编译器意识到这个加法是没有意义的,故而优化掉,所以,整个表达式被优化为:
a   =   b &apos;

加上刚才计算子表达式的值时计算的b   =   a。

故而C#的编译器做出了最简的IL代码。