整数蓝调,短+ =短小的问题

程序在C#中:

short a, b; a = 10; b = 10; a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'. // we can also write this code by using Arithmetic Assignment Operator as given below a += b; // But this is running successfully, why? Console.Write(a); 

这里有两个问题。 首先是“为什么短加结果是int?”

那么,假设短加短暂,看看会发生什么:

 short[] prices = { 10000, 15000, 11000 }; short average = (prices[0] + prices[1] + prices[2]) / 3; 

当然,平均值是-9845,如果这个计算是在短期内完成的话。 总和大于最大可能的短,所以它绕到负数,然后你除负数。

在整数运算环绕它的世界中进行所有int计算是明智的,这种类型对于典型的计算来说可能有足够的范围来避免溢出。

第二个问题是:

  • 短加短是int
  • 把int分配给short是非法的
  • a + = b与a = a + b相同
  • 所以短+短=应该是非法的
  • 那么为什么这是合法的?

这个问题有一个不正确的前提。 上面的第三行是错误的。 C#规范在7.17.2节中说明

否则,如果选择的操作符是预定义的操作符,如果所选操作符的返回类型可以显式转换为x的类型,并且如果y可隐式转换为x的类型,或者操作符是移位操作符,则操作被评估为x =(T)(x op y),其中T是x的类型,除了x仅被评估一次。

编译器以您的名义插入演员阵容。 正确的推理是:

  • 短加短是int
  • 把int分配给short是非法的
  • s1 + = s2与s1 =(short)(s1 + s2)相同
  • 因此这应该是合法的

如果它没有为你插入演员,那么在许多类型上都不可能使用复合赋值。

那么+=运算符说你会用一个short来增加a的值,while表示你会用操作的结果覆盖这个值。 a + b操作产生一个int,不知道它可以做什么,你试图把这个int分配给一个short。

你必须使用:

 a = (short)(a + b); 

至于赋值和赋值的行为之间的区别,我想它与这个(来自msdn)有关,

 x+=y is equivalent to x = x + y except that x is only evaluated once. The meaning of the + operator is dependent on the types of x and y (addition for numeric operands, concatenation for string operands, and so forth). 

但是,这个有点含糊,所以有更深层次理解的人可以评论一下。

发生这种情况是因为int是定义了+的最小符号类型。 任何更小的东西首先被提升为int。 +=运算符是根据+=定义的,但是有一个特殊的规则来处理不符合目标的结果。

这是因为+ =被实现为一个重载函数(其中一个是简短的,编译器选择最具体的过载)。 对于表达式(a + b),编译器在分配之前默认将结果扩展为int。