在赋值语句中自动提升右侧表达式的编译器类型

Compiler Type Promotion of Right Hand Side expressions automatically in an Assignment Statement

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

例如 "double x = (88.0 - 32) * 5 / 9" 正确地将华氏度转换为摄氏度,但是... "double x = (88.0 - 32) * (5 / 9)"不会。

我的问题不是为什么第二个例子没有return想要的结果。我的问题是为什么编译器不将 (5/9) 的求值提升为双精度值。

Why does a compiler not type promote all evaluations of expressions in the right hand side of an assignment expression to at least the left hand sides type level?

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

double x = 88.0 - 32 * 5 / 9

现在可以通过多种方式将所有标记(词位)的此赋值的 RHS 部分完全转换为 double。我正在添加其中一些:-

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

这变成了像"In how many ways a given expression can be reduced to double(whatever type)?"

这样的组合问题

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

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