请考虑以下代码段:
int i = 5 / 0;
这会导致编译器错误 CS0020:被常数零除,这很好。但是,下一个代码段:
int i = 10;
i = i / 0;
编译正常。
有人知道为什么吗?我看不出为什么编译器允许将整数变量除以零整数常量。
答案 0 :(得分:14)
在一般情况下,编译器没有理由在运行时禁止除以零(或任何其他数字)。
但是,您的第一个示例是一个编译时间常量,即它是由编译器计算的,并由求值结果代替。这就是编译器所抱怨的,因为它不知道要用什么整数值代替5/0。
答案 1 :(得分:7)
这只是编译时间检查和运行时检查之间的区别。虽然
i = i / 0;
投掷
System.DivideByZeroException:“试图除以零。”
的
i = 5 / 0;
出现编译错误
错误CS0020除以常数0。
5 / 0
的值是在编译时求值的,这就是接收错误和获取异常之间的区别。
编辑:
考虑到这里答案的注释,我将花一些时间编写一个假设,说明编译器为何以这种方式工作。编译器从未打算防止变量除以零。如果您愿意这样做,则可以这样做,并且可以用一些偷偷摸摸的方法来使程序除以零。编译器应该做的只是在可能的时候进行一些优化,通过计算它来进行微积分并将其替换为结果值。当它看到被零除时,由于无法计算,因此只会给您一个错误。
答案 2 :(得分:3)
由于编译器将int i = 5 / 0;
转换为常数值,因此它必须在编译时计算该值,这会导致错误。
但是代码
int i = 10;
i = i / 0;
在形式上是正确的。它会引发异常,这是您的决定以及生成此类异常的意图。
答案 3 :(得分:0)
与每个人在这里所说的一样。 这行是编译时间,因为编译器不知道答案,这会给出错误
int i = 5 / 0;
这行是运行时检查,它只是一般的数学计算,因此编译器没有理由将其抛出错误
int i = 10;
i = i / 0;