本文的测试环境是VS2008,测试语言是C#。
以前我一直认为a=a+b a+=b没有什么区别,网上的一些人也认为这两句没有什么很大的区别。但是今天在用C#中checked关键字检查溢出的程序中发现用前者编译不能通过,后者可以,带着这个疑问,我又查了一些资料,终于有了一个合理的解释,如果有错误,希望大神指正。
问题是这样的,byte类型的数据取值范围是0-255,在C#中定义两个byte型的变量,分别赋值100 200,求和,显然他们的和溢出了,于是要用checked语句检查溢出,我发现,当代码写成a+=b的时候,a的输出结果是44,显然,溢出影响了输出值,但是代码写成a=a+b根本就编译通不过,错误信息是不能把byte隐式的转化为int。我认为这个例子在侧面印证了a+=b比a=a+b的运行更快。
a+=b是把b内存单元的值直接加到了a的内存单元,a=a+b是把a b内存单元的值分别拿出来,相加以后存到寄存器,再由寄存器存回a的内存单元,中间有了寄存器就存在了隐式转化的问题,而显然前者的运行速度更快,这就是我对于这个问题的理解。