C#中的算术异常

为什么在C#中示例一个有效的,可编译的并且只是包装而示例B将无法编译?

一个

int val = 0;
val = val + Int32.MaxValue +2;

要么

int val = Int32.MaxValue;
val++;

int val = 0;
val = 2147483647 + 1;

要么

int val = 0;
int val = Int32.MaxValue + 1;

默认情况下,我知道默认情况下不会检查算术异常,除非您使用配置中的checked方法,块或属性明确地这样做.我的问题更多地涉及编译器然后如何发生算术异常.

解决方法

您的B示例在编译时为 constant-folded,向编译器指示它保证溢出.

因为您的A示例使用变量,所以表达式不能(完全)常量折叠,因此编译器无法保证这些值会导致溢出.

例如…

int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow

但是,如果您知道val不会更改,并将0分配给const int:

const int startval = 0;
int val = startval + Int32.MaxValue + 2;

您可以获得编译时溢出检查,因为该值可以完全确定,因此可以进行常量折叠.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


c语言数组越界会怎么样
c语言指针怎么等于数组
c语言数组怎么存入文字
c语言中怎么显示数组
c语言数组元素怎么选
c语言数组怎么累加
c语言数组符号怎么输入
c语言怎么用长数组
c语言数组函数怎么输入
c语言数组怎么去掉差异
c语言怎么求解数组
c语言数组怎么用变量
c语言怎么申明数组
c语言怎么控制数组
c语言怎么计算数组长度
c语言数组怎么插星号
c语言数组怎么加长度
c语言中怎么输出数组
c语言怎么记住数组边界
c语言数组怎么输入符号