2012-03-23 178 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也會發生同樣的情況,所以直接加倍。