“val ++”vs“val = val + 1”究竟有什么区别?

时间:2011-06-17 14:03:56

标签: .net .net-assembly short

我创建了一个基本的控制台应用程序来进行这样的测试。

        short val = 32767;

        val++;

        Console.WriteLine(val);

这给了我 -32768 作为预期结果

        short val = 32767;

        val = val +1;

        Console.WriteLine(val);

但这给了我这个错误

错误1 **无法将类型'int'隐式转换为'short'。存在显式转换(您是否缺少演员?)

我很好奇是什么原因造成的?

提前致谢,

8 个答案:

答案 0 :(得分:12)

short + short操作的结果定义为int。在第一种情况下,编译器正在继续并对增量的结果应用(short)强制转换,但它不在第二种情况下。

short myShort = 1;
int resultA = myShort + myShort; // addition returns an integer
short resultB = myShort++; // returns a short, why? 

// resultB is essentially doing this
short resultB = (short)(myShort + 1);

除了Joel在评论中提供的链接之外,您还可以参考C# 4.0 language specification的7.3.6.2节,其中列出了二进制数字促销的规则(涵盖{{1}形式的表达式并且还包括7.6.9,它涵盖了前缀和后缀运算符。

答案 1 :(得分:2)

添加两个short将返回int

+=++运营商behave differently并按预期工作。

答案 2 :(得分:1)

在你的情况下,添加两个short或short和int的结果总是int类型,需要转换回short以便分配给val。

之所以如此,那么两个短路的总和,或者短路和一个整数可能都不合适,所以总是int。考虑一下;

short x = 30000;
short y = 30000;

int z = x+y; // would you really want to get a number other than 60000 here?  
short s = (short)(x+y); //if you want modulo 2^16

答案 3 :(得分:0)

您队中的1

val = val +1;

隐含int,因此val + 1的结果为int。你试图将该值分配为一个简短的值,而这是无法隐式完成的,因为你可能会失去一些精确度。

答案 4 :(得分:0)

使用val + 1会让它认为它是一个整数。

使用:

    short val = 32767;

    val = (short) (val + 1);

    Console.WriteLine(val);

应该工作。

答案 5 :(得分:0)

数字的评估默认为int(Int32)。

在这种情况下,您尝试将short(Int16)添加到int(Int32)类型。这正确地引发了错误。

答案 6 :(得分:0)

val = val +1;

此处1的类型为int,因此val + 1

答案 7 :(得分:0)

运行val++时,只需增加存储在变量中的值。

当您运行val=val+1时,默认情况下1int,因此编译器会将这两个值视为ints,并返回值为int的{​​{1}} val+1。然后它无法将其重新放回val,因为int很大,可以短暂存储。