s+=1和s=s+1

    s=s+1与s+=1在官方网站上听说是等效的,但是在实际的应用中,它们之间仍是有一点小小的区别,这些区别形成了一些困惑,如今就对这些区别作一些解释。c#

    前几天一个很牛的朋友问我:“s=s+1与s+=1有什么区别?”,我认为他在开玩笑,由于以这个朋友的实力,不会不知道这个的,我认为这是一个陷阱,赶快到MSDN上 进行查询,获得的结果是:ide

使用 += 赋值运算符的表达式,函数

x += y等效于 x = x + y。既然MSDN上都说了“等效”,固然它们应该是同样的。个人朋友当即给我发过来一段代码,   short s = 1;         s = s + 1;         short n = 1;         n += 1;         Console.ReadKey();其中s=s+1编译错误:没法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺乏强制转换?),而且定位在s=s+1这一行,从这里看两个还真的不等效。因而将代码改写为short s = 1;            s = (short)(s + 1);            short n = 1;            n += 1;            Console.ReadKey();编译经过,因而推测s=s+1这个表达式中,1被默认的看为整型int,根据运算规则,s+1中的s也会隐式的转换成int,因而结果就变成了int类型,因为int类型比short类型的精度高,因此将int赋值给short时,须要进行强制类型转换,因而,我又编写了下面的代码            short s = 1;测试

            short k = 2;网站

            s = s+k;this

            short n = 1;spa

            n += 1;字符串

            Console.ReadKey();string

编译仍然不能经过,提示信息错误没法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺乏强制转换?),晕倒,short+short得出的结果仍然是int类型,为了测试这个想法,因而编写代码以下:it

            short s = 1;

            short k = 2;

            Console.WriteLine((s + k).GetType().FullName);

            short n = 1;

            n += 1;

            Console.ReadKey();

获得的结果是System.Int32(在c#中,short对应System.Int16,int对应System.Int32),在C#中,为数值类型和字符串类型预约义了二元 + 运算符。其实+运算符应该也是一个函数调用,只是这个函数的名字比较特殊罢了。

当一个函数的名称相同,而要根据参数的类型或者参数的个数的不一样而有不一样的实现的时候,须要进行函数的重载,问题可能就是出如今这个+运算符的重载了。

推测在系统的内部,系统只重载了 int operator+(int,int)这样的函数,在进行short+short运算时,系统寻找精确的匹配,可是没有找到,但是将short升级为int是一个自动的过程,因而系统调用了int operator(int,int)这个函数,获得的结果也就被转化为int类型,就出现了上面的错误。

而+=这个运算符与+运算符同样,可是系统重载了short operator +=(short,short)或者short operator +=(int,int),这个函数的具体实现没办法看到,但是据推测应该是这样

short operator+=(int b)

{

   return (short)(this+b);

}

也就是在返回数据的结果前,系统本身作了强制类型转换。为了验证这个思想,我又作了两件事情。

第一:对short类型扩展一个方法(vs2008的扩展方法),该方法实现的是两个short类型的变量的加和,可是在返回结果前,对结果进行强制类型转换。代码以下:

namespace ConsoleApplication1

{

    static class Myshort

    {

        public static short add(this short a,short b)

        {

            return (short)(a+b);

        }

    }

}

从新编写代码

            short s = 1;

            short k = 2;

            s=s.add(k);

没有任何问题,编译经过。

   第二:对源代码进行反编译,看看反编译的代码

源代码以下:

static void Main(string[] args)

        {

            short s = 1;

            short k = 2;

            s=s.add(k);

            short n = 1;

            n += 1;

            Console.ReadKey();

        }

生成的反编译的代码:

private static void Main(string[] args)

{

    short s = 1;

    short k = 2;

    s = s.add(k);

    short n = 1;

    n = (short) (n + 1);

    Console.ReadKey();

}

对比能够知道,+=运算符果真在返回结果以前系统进行了强制类型转换。

相关文章
相关标签/搜索