根据documentation int.MaxValue
是一个int字段。当我做的时候
int a = int.MaxValue;
int b = a + 1;
b
的值为int.MinValue
,符合预期。但是当我做的时候
int a = int.MaxValue + 1;
我收到编译错误
操作在编译时以检查模式溢出
为什么会有区别?
答案 0 :(得分:2)
来自https://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx:
constant-expression是一个可以在编译时完全评估的表达式。
和
每当表达式是上面列出的类型之一并且仅包含上面列出的结构时,表达式在编译时计算。
和
除非在未经检查的上下文中显式放置常量表达式,否则在表达式的编译时评估期间在整数类型算术运算和转换中发生的溢出总是会导致编译时错误
这就解释了为什么int a = int.MaxValue + 1;
会出现编译错误(int.MaxValue
是const int
)。
int a = int.MaxValue;
int b = a + 1;
是不同的,因为它不是常量表达式。它们是两个非常量变量(参见并且只包含上面列出的结构?显然声明中间变量不是可接受的结构之一:-))
答案 1 :(得分:2)
不同之处在于,在第一行中,您添加了两个常量。 int.MaxValue
是常数,1也是常数。因此,编译器在编译时进行计算,并在此警告时失败。
第二行将产生相同的行为,但在运行时,因为您已经引入了变量,并且您的编译器没有足够的优化它来在编译时进行计算时间。
答案 2 :(得分:1)