Moh*_*ari 68 c# int types 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);
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 71
这里有两个问题.第一个是"为什么短的加上短的结果在int?"
好吧,假设空头和空头很短,看看会发生什么:
short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;
Run Code Online (Sandbox Code Playgroud)
当然,如果这个计算是短暂的,那么平均值是-9845.总和大于最大可能的短,所以它包围负数,然后你除负数.
在整数运算环绕的世界中,在int中进行所有计算更为明智,这种类型可能具有足够的范围以使典型计算不溢出.
第二个问题是:
这个问题有一个错误的前提; 上面的第三行是错误的.C#规范在7.17.2节中说明
否则,如果所选运算符是预定义运算符,如果所选运算符的返回类型可显式转换为x类型,并且如果y可隐式转换为x类型或运算符是移位运算符,则操作被评估为x =(T)(x op y),其中T是x的类型,除了x仅被计算一次.
编译器代表您插入强制转换.正确的推理是:
如果它没有为你插入演员表那么就不可能在许多类型上使用复合赋值.
你必须使用:
a = (short)(a + b);
Run Code Online (Sandbox Code Playgroud)
至于赋值和赋值赋值行为之间的区别,我想它与此有关(来自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).
Run Code Online (Sandbox Code Playgroud)
然而,它有点模糊,所以具有更深刻理解的人可以发表评论.
发生这种情况是因为int是+
已定义的最小签名类型.任何较小的东西首先被提升为int.该+=
运营商相对于定义的+
,但处理不符合目标结果的特殊情况规则.
归档时间: |
|
查看次数: |
14123 次 |
最近记录: |