整数蓝调,短+ =短小的问题
程序在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。