实现简单类型推断

时间:2015-05-25 20:40:31

标签: c type-inference

如何实现基本类型推理,只是因为推断给定值是整数,双精度还是浮点数而没什么特别的。例如,如果我为每种类型WHOLE_NUMBER,FLOAT_NUMBER,DOUBLE_NUMBER都有一个令牌,并且我有一个类似4f + 2 + 5f的表达式,我将如何推断出它是什么类型的?我目前的想法是只使用第一种类型作为推断类型,因此这将是一个浮点数。但是,这在大多数情况下都不起作用。我该怎么办?

2 个答案:

答案 0 :(得分:1)

我目前的想法是只使用第一种类型作为推断类型

没有。通常,表达式的类型是其“最宽泛”的术语。如果它包含一个double,那么它是一个double。如果没有,但包含一个浮点数,那么它就是一个浮点数。如果它只有整数那么它就是整数...

这适用于每个带括号的子表达式。 除非你做一个明确的演员。

在上面的例子中,有2个浮点数和一个int,所以它是一个浮点数。编译器应该警告你,因为它必须进行的任何隐式转换都可能导致数据丢失。

答案 1 :(得分:0)

我这样做的方法就是投入最精确的"或特定类型。例如,如果将一堆整数添加到一起,则结果始终可以用整数表示。表达式中包含浮点值的时刻,结果必须是浮点数,因为计算结果可能是由于加法中的浮点项而导致的小数。

类似地,如果表达式中有任何双精度数,则答案必须是double,因为向下转换为float可能会导致精度损失。因此,推断类型所需的步骤是:

  • 表达式是否包含double个?如果是,则结果为double - 根据需要将任何整数或float转换为double。如果不是......
  • 表达式是否包含float个?如果是,则结果为float - 大小写为float的任何整数。如果不是......
  • 结果是一个整数,因为表达式完全是整数。

不同的编程语言以不同的方式处理这些情况,并且在这些自动强制转换可能导致精度错误的情况下添加编译器警告可能是适当的。通常,确保编译器/解释器的行为是明确定义且可预测的,这样任何需要替代行为的开发人员都可以(并且知道何时)使用显式转换,如果他们需要保持计算的准确性。