“val++”与“val = val + 1”有啥区别?
Posted
技术标签:
【中文标题】“val++”与“val = val + 1”有啥区别?【英文标题】:"val++" vs "val = val + 1" What is exact difference?“val++”与“val = val + 1”有什么区别? 【发布时间】:2011-06-17 14:03:56 【问题描述】:我创建了一个基本的控制台应用程序来进行这样的测试。
short val = 32767;
val++;
Console.WriteLine(val);
这给了我 -32768 作为预期结果
short val = 32767;
val = val +1;
Console.WriteLine(val);
但这给了我这个错误
错误 1 *无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少演员表?)
我很好奇是什么原因造成的?
提前致谢,
【问题讨论】:
【参考方案1】: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 在 cmets 中提供的链接之外,您还可以参考 C# 4.0 language specification 的第 7.3.6.2 节,其中列出了二进制数字提升的规则(涵盖 a = b + c;
形式的表达式)以及7.6.9 涵盖前缀和后缀运算符。
【讨论】:
+1:作为附录,这里是 MSDN 资源:msdn.microsoft.com/en-us/library/ybs77ex4.aspx【参考方案2】:添加两个short
s 将返回一个int
。
+=
和 ++
运算符 behave differently 并按预期工作。
【讨论】:
【参考方案3】:在您的情况下,添加两个 short 或一个 short 和一个 int 的结果始终是 int 类型,需要将其转换回 short 才能分配给 val。
之所以会这样,是因为两个 short 的总和,或者一个 short 和一个 int 可能不适合 short,所以总是 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
【讨论】:
【参考方案4】:您的行中的1
:
val = val +1;
隐含地是一个int
,所以val + 1
的结果是一个int
。您正在尝试将该值指定为短,而这不能隐式完成,因为您可能会失去一些精确度。
【讨论】:
【参考方案5】:使用val + 1
使它认为它是一个整数。
使用:
short val = 32767;
val = (short) (val + 1);
Console.WriteLine(val);
应该可以。
【讨论】:
【参考方案6】:数字的评估默认为 int (Int32)。
在您的情况下,您尝试将 short(Int16) 添加到 int(Int32) 类型。这会正确地引发错误。
【讨论】:
【参考方案7】:val = val +1;
这里,1
是 int
类型,val + 1
也是。
【讨论】:
【参考方案8】:当您运行val++
时,您只需递增存储在变量中的值。
当您运行val=val+1
时,1
默认为int
,因此编译器认为这两个值都是ints
并返回一个int
,其值为val+1
。然后它无法将其放回val
,因为int
太大而无法存储。
【讨论】:
以上是关于“val++”与“val = val + 1”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章