2010-02-15 55 views
2

我很難理解的文章Cast the return value of a function that returns a floating point type投射返回一個浮點類型的函數的返回值

(1)在

轉換彷彿被分配給該函數的類型是必需的如果返回表達式的類型與該函數的類型不同,但如果返回表達式的值較寬,則僅因爲廣泛的評估。

什麼是「廣泛評估」?它試圖說什麼?

(2)在本例中

float f(float x) { 
    return x * 0.1f; 
} 

float g(float x) { 
    return x * 0.1; 
} 

爲什麼「函數f允許比浮子返回一個值更寬,但函數g(它使用更寬的常數)不爲」?

在f(),x和0.1f都是浮點型,所以我認爲x * 0.1f也是浮點型?在g()中,0.1可能被認爲是double,所以x * 0.1是雙精度型?什麼是文章的道德?

感謝和問候!

+0

氣味像功課 – JonH 2010-02-15 20:42:05

+1

@JonH:我很懷疑安全編碼的限制正在做功課....聽起來就像是試圖跟上進度找工作。 – 2010-02-15 20:43:28

+0

這聽起來不像功課。誰在正確的思想在教室裏教C語言的瘋狂特性?這是真實的世界! – 2010-02-15 20:44:24

回答

2

函數g返回類型float,它是一個32位的值。 0.1被解釋爲double,這意味着x * 0.1表達式返回一個double。 double是一個64位的值,它會導致縮小的轉換以便作爲浮點返回。 x可以安全地轉換爲double,因爲這是從float到double的擴展轉換。

1

(1)在

Conversion as if by assignment to the type of the function is required 

如果返回表達具有 不同的類型的功能,但不 如果返回表達具有 更寬值不僅是因爲寬 評價。

什麼是「廣泛評估」?它試圖說什麼 ?

如果聲明一個字節變量或常量,它實際上可能會作爲DWORD存儲在32位平臺上。字節算術也可以實現爲32位算術(廣泛評估)。它不會導致整數類型的問題。

(2)在本例中

浮子F(浮動x)的{返回X * 0.1F;}

浮子克(浮X){返回X * 0.1; }

爲什麼「函數f允許比浮子返回一個 值更寬,但函數g (它使用更寬的常數)是 不是」?

這就是現在的C標準所說的:0.1f可以以更寬的格式(比浮點)存儲,x * 0。1f也可以以更寬的格式進行評估,並且返回運算符不需要執行轉換爲浮點運算,並且可以返回「原樣」結果。使用g函數,返回運算符需要執行從double到float的轉換。

在F(),x和0.1F都是float類型 所以我認爲X * 0.1F也漂浮 類型?在g()中,0.1可能被認爲是 的兩倍,所以x * 0.1是雙倍的?

是的,這是適合所有的32位編譯器(至少我認爲是這樣:))。但文章總的來說就是處理這個問題。

(3) 文章的道德是什麼?

C標準是學習一個很難的事情:)