在Swift中编译时间检查除以0

时间:2016-09-19 21:27:53

标签: swift compile-time divide-by-zero

为什么range返回print(1.0 / 0)inf返回NaN而print(0.0 / 0)在编译时失败?

似乎Swift编译时检查整数除以0而不是浮点数/双精度数?

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

用于浮点数的IEEE 754标准及其算法定义了"无穷大"并且"不是数字"作为有效值。它们可能不是有效的"在数学上有用的意义上......但它们是标准所定义的。使用浮点数的代码需要来自某些操作的那些值,并且如果需要可以检查/响应它们,因此Swift尊重FP数学的标准。

对于整数算术,没有相应的跨语言,独立于CPU的标准。在Swift之外,它通常假设将整数除以零是Bad Thing,因为你不必知道它是否会停止程序或产生不正确的结果。

Swift的默认行为是"安全"对于所有整数运算,因此任何会溢出该类型边界的操作都会导致运行时异常。 (包括除以零。)

当您将0 / 0放在文字代码中时,会出现编译时错误,因为Swift在编译时对常量执行算术运算。 (如果您有let x = 1 + 2之类的代码,那么在运行时计算生成的3是没有意义的,因为它对于您的程序的所有运行都是常量。)