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



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

。"double x =(88.0 - 32) * 5/9"可以正确地从华氏温度转换成摄氏温度,但是…"double x =(88.0 - 32) *(5/9)"将不会。

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

为什么编译器不类型提升中表达式的所有求值赋值表达式的右侧至少向左手侧型水平?

非常好的问题。实际上,让我们假设有时编译器会自动完成这个。现在,以您的例子为例:-

double x = 88.0 - 32 * 5 / 9

现在,这个赋值的RHS部分可以通过几种方式对所有令牌(词素)完全转换为double。我添加了一些:-

  1. 88.0 - 32 *(双)(5/9)
  2. 88.0 - 32 * 5/9//默认规则
  3. 88.0 - (double)(32 * 5)/9
  4. 单独类型转换,使每个令牌看起来不是双重实体。
  5. 其他几种方式。

这就变成了组合问题,比如"给定表达式有多少种方法可以简化为双精度(无论哪种类型)?"

但是,考虑到内存的耗尽,编译器设计者不会花这么大的力气将每个标记转换为所需的最高类型(这里是double)。而且,这样做似乎是一种不自然的理由,因为用户可以通过手动给编译器一些提示来更好地执行操作,它必须使用用户编码的方式进行类型转换。

作为所有的自动转换并不总是会产生你想要的结果,因为有时用户想要的东西可能无法通过这种自动类型提升的原理实现,BUT,反过来,类型提升将以一种更好的方式服务,就像今天的编译器所做的那样。当前的类型转换规则虽然需要做一些额外的工作,但是完美地

最新更新