2012-03-23 179 views
1

评估以下表达式时发生了哪些转换?这里发生了哪些转换?

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; 

我的想法:

一)我想if需要bool值,因此float被隐式现浇到bool

b)我假设fval被提升为doubleival被转换为double,然后他们被添加。

c)首先,将ival转换为double。然后dval + ival得到评估,这是double类型。然后cval ......我不知道它是否直接转换为double,或者是否先将它升级为int。无论如何,在该步骤之后,临时值dval + ival被添加到该double

我的理解是否正确?

+3

这三者都有未定义的行为,因为它们涉及从未初始化的值读取数据。 – Mankarse 2012-03-23 13:07:31

+0

我找不到任何错误,但我无法背诵这些标准。不过,我会说你比大多数C++程序员更了解细节。 – Sjoerd 2012-03-23 13:08:03

+1

@Mankarse结果未定义,而不是发生哪些转换。 – 2012-03-23 13:09:26

回答

2

a)fval上下文转换为bool


在箱子bc中, “通常的算术转换” 适用,这意味着:

b)中ival被转换为float和(使用一个特殊的规则,而不是“通常的算术转换“)fval + ival转换为double

c)ival转换为double,cval转换为double

2

记住魔鬼在这样的问题的细节,总是有可能你错过了什么。

答:事实上,我在stackoverflow上找到了答案(Is if(double) valid C++?):if中的所有内容都直接转换为布尔值。 B)首先将iVal转换为float,然后将其添加到fVal,然后转换为double。表达式在赋值之前完全评估/键入。 C)从左到右的顺序将应用于+运营商。所以iVal转换为double,然后添加到dVal,然后cVal也会发生同样的情况,所以直接加倍。