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

推荐订阅源

S
Schneier on Security
雷峰网
雷峰网
S
Securelist
V
Vulnerabilities – Threatpost
S
SegmentFault 最新的问题
T
The Exploit Database - CXSecurity.com
A
About on SuperTechFans
T
Threat Research - Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
L
LangChain Blog
Cyberwarzone
Cyberwarzone
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
V2EX
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
L
Lohrmann on Cybersecurity
S
Security Affairs
S
Secure Thoughts
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
Spread Privacy
Spread Privacy
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
H
Heimdal Security Blog
L
LINUX DO - 热门话题
月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
Google Online Security Blog
Google Online Security Blog
WordPress大学
WordPress大学
D
DataBreaches.Net
N
Netflix TechBlog - Medium
The Hacker News
The Hacker News
N
News and Events Feed by Topic
C
Check Point Blog
博客园_首页
Scott Helme
Scott Helme
T
Troy Hunt's Blog
U
Unit 42

博客园 - 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代码。