为什么我在这里遇到编译错误:
int a = 2147483647 + 10;
而不是在这里,如果我正在执行相同的操作:
int ten = 10;
int b = 2147483647 + ten;
我正在学习使用已检查,并且MSDN网站无法清除为什么在第一个代码段中引发了OverflowException:
默认情况下,仅包含常量值的表达式会导致a 如果表达式生成一个超出的值,则编译错误 目的地类型的范围。如果表达式包含一个或多个 非常量值,编译器不检测溢出。
它只解释行为,但不解释该行为的原因。我想知道引擎盖下会发生什么。
答案 0 :(得分:9)
原因是当int a = 2147483647 + 10;
编译器可以预测语句(a
)的结果时,它会知道它会导致溢出,因为 2147483647 和 10 是常量,它们的值在编译时是已知的。
但是当你有
时int ten = 10;
int b = 2147483647 + ten;
某些其他线程(或者其他东西,可能是向导,可能是内存中的危险...)可能在执行ten
语句之前更改了int b = 2147483647 + ten;
的值,并且溢出不能在编译时预测。