【问题标题】:What conversions are taking place here?这里发生了哪些转变?
【发布时间】:2012-03-23 13:02:42
【问题描述】:

计算以下表达式时会发生哪些转换?

char cval;
int ival;
float fval; 
// Assume all 3 have been set to correct values...
a) if(fval)
b) double dval = fval + ival; 
c) dval + ival + cval;

我的想法:

a) 我假设 if 需要一个 bool 值,因此 float 被隐式转换为 bool

b) 我假设fval 被提升为double 并且ival 被转换为double,然后它们被添加。

c) 首先,ival 被转换为double。然后dval + ival 被评估,其类型为double。然后cval...不知道是直接转成double,还是先升级成int。无论如何,在这一步之后,临时值 dval + ival 被添加到 double

我的理解正确吗?

【问题讨论】:

  • 这三个都有未定义的行为,因为它们涉及读取未初始化的值。
  • 我没有发现任何错误,但我无法在这些点上背诵标准。不过,我想说你比大多数 C++ 程序员更了解细节。
  • @Mankarse 结果未定义,不是发生了哪些转换。
  • @Mankarse 是的。但是不要看,假设它们已经正确初始化,它只是关于发生的转换

标签: c++ type-conversion implicit-conversion


【解决方案1】:

a) fval 在上下文中转换为 bool


bc 的情况下,“通常的算术转换”适用,意思是:

b) ival 转换为 float 并且(使用特殊规则,而不是“通常的算术转换”)fval + ival 转换为 double

c) ival 转换为doublecval 转换为double

【讨论】:

    【解决方案2】:

    记住,像这样的问题在细节中是魔鬼,你总是可能错过一些东西。

    A) 其实我在 stackoverflow(Is if(double) valid C++?) 上找到了答案:if 中的所有内容都直接转换为布尔值。

    B) 首先将 iVal 转换为 float,然后添加到 fVal,然后再转换为 double。表达式在赋值之前被完全评估/键入。

    C) 从左到右的顺序将应用于 + 运算符。所以 iVal 被转换为双精度,然后添加到 dVal,然后 cVal 也会发生同样的情况,所以直接加倍。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多