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

推荐订阅源

博客园 - 司徒正美
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
WordPress大学
WordPress大学
罗磊的独立博客
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
H
Help Net Security
S
SegmentFault 最新的问题
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
腾讯CDC
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
D
DataBreaches.Net
雷峰网
雷峰网
GbyAI
GbyAI
宝玉的分享
宝玉的分享

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