【发布时间】:2014-10-06 21:25:52
【问题描述】:
在未经检查的上下文中,是否向具有值2147483647 的整数加一保证会导致-2147483648?
比如下面的代码
const int first = int.MaxValue;
int second = first;
if ( second >= first )
{
Console.WriteLine( "First check" );
}
second++;
if ( second >= first )
{
Console.WriteLine( "Second check" );
}
在 C++ 中,打印“第一次检查”和“第二次检查”都是完全有效的,因为优化器可以将第一次检查的结果用于第二次检查。
C#也是这样吗?
【问题讨论】:
-
您是否尝试过将数字加 1 并在调试器中检查它。它应该会产生
-2147483648 -
说到.NET,编译器真的只有一个
-
@DJKRAZE:这并不意味着行为已定义(或未定义)。
-
@Steve 至少有三个编译器,所有这些都被使用。微软的原版、微软的 Roslyn 和 Mono 的。
-
@Cory:第一个隐含地回答了第二个。 C++ 优化器可以删除第二个分支的唯一原因是有符号整数溢出导致 UB。因此,优化器可以假设增量没有溢出。在 C# 中,行为已定义且有效,因此无法做出这样的假设。
标签: c# .net language-lawyer