整数求和布鲁斯,short + = short 问题

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);
18704 次浏览

好的,+=运算符说你将用一个短的值来增加 a的值,而 =说你将用一个运算的结果来增加 覆盖的值。操作 a + b生成一个 int,但不知道它可以做其他操作,并且试图将该 int 赋给 short。

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

你必须使用:

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。+=操作符是根据 +定义的,但是用于处理不符合目标的结果的特殊情况规则。

这里有两个问题,第一个是“为什么短加短结果是 int?”

假设短加短是短的,看看会发生什么:

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

当然,如果这个计算是在短时间内完成的,平均值是 -9845。和大于最大可能的空头,所以它包围成负数,然后除以负数。

在一个整数算法包围着它的世界里,用 int 来完成所有的计算要明智得多,int 类型可能有足够的范围来保证典型的计算不会溢出。

第二个问题是:

  • Short 加 short 是 int
  • 将 int 赋值为 short 是非法的
  • A + = b 等于 a = a + b
  • 因此 short + = short 应该是非法的
  • 那为什么这是合法的?

这个问题有一个不正确的前提; 上面的第三行是错误的

否则,如果选定的运算符为 一个预定义的运算符,如果返回 选定运算符的类型为 显式可转换为 如果 y 是可隐式转换的 到 x 的类型,或者运算符是 移位操作员,然后操作是 计算为 x = (T)(x opy) ,其中 T 是 x 的类型,除了 x 是 只评估一次。

编译器代表您插入强制转换。正确的推理是:

  • Short 加 short 是 int
  • 将 int 赋值为 short 是非法的
  • S1 + = s2等于 s1 = (short)(s1 + s2)
  • 所以这应该是合法的

如果它没有为您插入强制转换,那么就不可能对许多类型使用复合赋值。