如果我们尝试运行以下代码:
int d = 10/0;
我们收到一个编译器错误。所以我们不能除以零。
现在考虑以下代码:
int d = 10;
int o = d / 0;
d可以有任何东西并且将任何东西除以零是不行的
我们没有收到编译器错误。该变量具有我们不能除以零的任何内容。当我们尝试将变量除以零时,为什么编译器没有给出错误?
您需要看一下C#语言规范的第7.18章。它讨论常量表达式。我将仅概述基础知识。
C#编译器努力尝试在编译时评估表达式。只要操作数都具有已知值,并且运算符是简单的运算符,则编译器可以在编译时计算表达式的值并直接使用结果,而不是在运行时生成代码来对表达式求值。这听起来像是一种优化,但并不是完全一样,在许多地方都需要常量表达式。就像case语句的值一样,使用const关键字的声明,枚举声明的值和[attribute]的参数也是如此。
因此,毫无疑问10 / 0
,这是一个具有文字值和简单运算符的表达式,因此编译器可以直接计算结果,并看到它将触发异常,因此在编译时会抱怨该异常。
的d / 0
是不因为恒定表达d
变量。您可能会争辩说,由于在上面的语句中分配了编译器,因此编译器很可能知道的价值d
。但这并没有做到,优化此类代码是抖动优化器的工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句