1

为什么编译器不将赋值表达式右侧的所有表达式求值提升到至少左侧的类型级别?

例如“double x = (88.0 - 32) * 5 / 9”可以正确地从华氏温度转换为摄氏温度,但是...“double x = (88.0 - 32) * (5 / 9)”不会。

我的问题不是为什么第二个示例没有返回所需的结果。我的问题是为什么编译器不将 (5/9) 的评估提升为双精度。

4

1 回答 1

2

为什么编译器不将赋值表达式右侧的所有表达式求值提升到至少左侧的类型级别?

非常好的问题。实际上,让我们假设编译器会自动执行此操作。现在,以您为例:-

double x = 88.0 - 32 * 5 / 9

现在,这个赋值的 RHS 部分可以通过多种方式完全转换为所有标记(词素)的双精度。我正在添加其中一些:-

  1. 88.0 - 32 * (双)(5 / 9)
  2. 88.0 - 32 * 5 / 9 // 默认规则
  3. 88.0 - (双)(32 * 5) / 9
  4. 单独类型转换以使每个似乎不是双重实体的标记加倍。
  5. 其他几种方式。

这变成了组合问题,例如“给定表达式可以通过多少种方式简化为双精度(无论是什么类型)?”

但是,考虑到内存的详尽使用,编译器设计者不会在他们的 *** 中将每个标记转换为所需的最高类型(此处为双精度)。此外,它无缘无故地这样做似乎是一个不自然的理由,因为用户可以通过手动向编译器提供一些提示,它必须使用用户编码的方式进行类型转换,从而更好地执行操作。

作为一切自动转换不会总是给你带来结果,因为有时用户想要的东西可能无法通过这种自动类型提升的原理实现,但是,反之亦然的类型提升会更好就像今天的编译器所做的那样。当前的类型转换规则可以正确地服务于所有目的,尽管需要付出一些额外的努力,但是FLAWLESSSLY

于 2015-07-24T02:31:39.387 回答