gpt4 book ai didi

c# - C#中的算术异常

转载 作者:太空狗 更新时间:2023-10-29 19:53:21 25 4
gpt4 key购买 nike

为什么在 C# 中,示例 A 是有效的、可编译的并且只会换行,而示例 B 将无法编译?

一个

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

int val = Int32.MaxValue;
val++;

B

int val = 0;
val = 2147483647 + 1;

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

我知道默认情况下不会检查算术异常,除非您在配置中使用检查方法、 block 或属性显式检查。我的问题更多地与编译器有关,然后是算术异常是如何发生的。

最佳答案

您的 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;

您可以恢复编译时溢出检查,因为该值可以完全确定并因此常量折叠。

关于c# - C#中的算术异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com