Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的算术异常#_C#_Integer Overflow - Fatal编程技术网

C# C语言中的算术异常#

C# C语言中的算术异常#,c#,integer-overflow,C#,Integer Overflow,为什么在C#中,示例A是有效的、可编译的,并且只会换行,而示例B不会编译 A 或 B 或 我知道在默认情况下,算术异常在默认情况下不会被检查,除非您在配置中使用checked方法、块或属性显式地进行检查。我的问题更多地涉及编译器,而不是算术异常是如何发生的。您的B示例在编译时,向编译器表明它肯定会溢出 由于A示例使用变量,表达式不能(完全)进行常量折叠,因此编译器无法保证值会导致溢出 例如 int val = 0; // some other thread changes `val` to -5

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

A

B

我知道在默认情况下,算术异常在默认情况下不会被检查,除非您在配置中使用checked方法、块或属性显式地进行检查。我的问题更多地涉及编译器,而不是算术异常是如何发生的。

您的B示例在编译时,向编译器表明它肯定会溢出

由于A示例使用变量,表达式不能(完全)进行常量折叠,因此编译器无法保证值会导致溢出

例如

int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow
但是,如果您知道
val
不会更改,并将0分配给
常量int

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

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

这与编译时检查的限制有关。某些事情只能在运行时知道

我知道算术异常在默认情况下不会被检查,除非您在配置中使用checked方法、块或属性显式地进行检查

你不知道,因为那句话是不正确的。事实上,你知道这是不正确的,因为你提供了一个案例,证明你的陈述是错误的

请参考C#规范第7.6.12节,为方便起见,我在此复制了其中的一部分:

对于未包含任何已检查或未检查的运算符或语句的非常量表达式(在运行时计算的表达式),默认溢出检查上下文未检查,除非外部因素(如编译器开关和执行环境配置)调用已检查的计算

对于常量表达式(可在编译时完全计算的表达式),始终检查默认的溢出检查上下文。除非常量表达式显式放置在未检查的上下文中,否则在表达式的编译时计算期间发生的溢出总是会导致编译时错误


有关更多详细信息,请参阅规范。

我认为您在发布问题时遗漏了soemthing。“我的问题更多地与_________;有关”之后是什么?这句话应该是“在运行时”才对
int val = 0;
val = 2147483647 + 1;
int val = 0;
int val = Int32.MaxValue + 1;
int val = 0;
// some other thread changes `val` to -5...
val = val + Int32.MaxValue +2; // no overflow
const int startval = 0;
int val = startval + Int32.MaxValue + 2;