2016-12-01 73 views
0

作为从my previous question的后续,我注意到奇怪的行为(用控制台)除以零。我发现下面的两个语句编译罚款:为什么小数在零除后会产生编译时错误?

Console.WriteLine(1d/0d); 
Console.WriteLine(1f/0f); 

而这两个给一个编译时错误:

Console.WriteLine(1/0); 
Console.WriteLine(1m/0m); 

Division by constant zero

为什么会出现这种行为差异?

+0

@JeroenVannevel我的问题是关于编译时错误,但我认为原因与运行时错误相同,谢谢 – TheLethalCoder

+0

这些问题是相关的,但它不是真正的重复:强调编译时错误。另一个是“为什么双倍允许除以0” – Guillaume

+0

@Guillaume尽管重复的回答了这个问题,并且涵盖了编译和运行时错误/异常,但我相信它仍然是一个骗局 – TheLethalCoder

回答

0

对于float和double类型,允许用0除以0。它返回无穷大。

对于Int32和Decimal,它是不允许的,它会引发异常。 编译器不允许在常量值上除以0,因为它会导致未定义的行为。

public class MyConsts { 
public const int i = 1/0; // Constant, compile time evaluation 
} 

... 

Console.WriteLine(MyConsts.i); // What would you expect ? 

编译器无法为常量表达式计算适当的值。请记住,该值是在运行时进行编译和评估的,因此无法引发异常。

+0

这正是我在我的问题中所说的,问题是为什么 – TheLethalCoder

+0

这是由设计。不同的数字类型的实现方式...不同的类型,不同的功能。 为什么downvote? – Guillaume

+0

我添加了一些关于为什么无法评估常量(编译时间)除以0的细节。 – Guillaume

相关问题