“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】:

添加两个shorts 将返回一个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;

这里,1int 类型,val + 1 也是。

【讨论】:

【参考方案8】:

当您运行val++ 时,您只需递增存储在变量中的值。

当您运行val=val+1 时,1 默认为int,因此编译器认为这两个值都是ints 并返回一个int,其值为val+1。然后它无法将其放回val,因为int 太大而无法存储。

【讨论】:

以上是关于“val++”与“val = val + 1”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

replace只能输入小数

sort()的用法!

Redshift 数据存储架构

将逗号分隔值拆分为 Oracle 中的列

数组排序 记录一下

从链接值中查找唯一用户