2013-06-05 127 views
2

今天,我才意識到,鑄造值的布爾是一種魔力:魔術爲bool

int value = 0x100; 
unsigned char uc = static_cast<unsigned char>(value); 
bool b = static_cast<bool>(value); 

兩個sizeof(uc)sizeof(b)回報1。我知道uc將包含0x00,因爲只有LSB被複制。但b將是true,所以我的假設是,當投射到bool時,值將被評估而不是被複制。

這個假設是否正確?這是一個標準的C++行爲?

+0

這是黑暗的藝術之一。 –

+0

一切都不是'0'是真的,因爲'0x100'不是'0'... – PlasmaHH

+1

我敢肯定這是一個其他SO問題,但無論如何,從C + + 03:「右值算術,枚舉,指針或指向成員類型的指針可以轉換爲bool類型的右值,零值,空指針值或空成員指針值被轉換爲false;任何其他值被轉換爲true。 –

回答

8

有什麼神奇之處。從intunsigned char的轉換被定義爲value % 256(對於8位char s),所以這就是你所得到的。它可以被實現爲複製LSB,但是你仍然應該在語義上思考它,而不是實現。

同樣,intbool的轉換被定義爲value != 0,所以再次,這就是你所得到的。

積分(和布爾)轉換由C++ 11標準覆蓋,其格式爲[conv.integral][conv.bool]。對於C型演員,請參閱[expr.cast][expr.static.cast]

+0

所以你說這是標準的C++行爲,並且可以安全使用?這是記錄在某處嗎? –

+0

@WouterHuysentruit我已經添加了對標準的引用。 – Angew

4

是的,當鑄造到bool時,該值被評估,而不是複製。

其實在你的例子中,只要value不是0,b就會是true

更新:從C++入門第五版章2.1.2報價:

When we assign one of the nonbool arithmetic types to a bool object, the result is false if the value is 0 and true otherwise.

+0

@WouterHuysentruit我沒有檢查過標準,但是C++ Primer確實這樣說過。查看更新。 –

4

它是標準的一部分:

4.12布爾轉化[conv.bool]

1算術,無作用域枚舉,指針或指針 的prvalue到構件型罐被轉換爲布爾類型的prvalue。零值 值,空指針值或空成員指針值被轉換爲 爲false;任何其他值都將轉換爲true。 std :: nullptr_t的值可以轉換爲bool類型的prvalue; 結果值是錯誤的。

3

根據rules for C-style casts,(bool)value實際上是static_cast。然後static_cast的第一條規則開始執行,該規則計算暫時的「聲明和初始化......的值」,如new_type Temp(expression);,即bool Temp(value);。這是明確的:Temptrue iff value != 0。所以是的,value在某種意義上被「評估」。

+0

感謝您的澄清。 –

0

鑄造到bool是從普通老C繼承的一個功能。最初,C沒有一個bool類型,它是在if語句中使用其它類型的,像這樣有用:

int myBool = 1; 
if(myBool) { 
    // C didn't have bools, so we had to use ints! 
} 

void* p = malloc(sizeof(int)); 
if(!p) { 
    // malloc failed to allocate memory! 
} 

當你轉換爲bool,它的作用就像你把聲明在if

當然,C++向後兼容C,所以它採用了這個特性。 C++還增加了將類轉換爲bool的能力。 iostream這是否指示何時流處於無效狀態:

if(!cout) { 
    // Something went horribly wrong with the standard output stream! 
} 
+0

我已經和C編譯器(如果我記得是正確的話)一起工作,定義了一個bool:'typedef char bool;',所以'bool b =(bool)0x100'肯定會導致'b'成爲'返回FALSE。 –

0

ISO/IEC C++標準:

4.12布爾轉化[conv.bool] 1所述的算術...類型的prvalue可以轉換爲布爾類型的prvalue。零值...被轉換爲假;任何其他值都將轉換爲true。

所以,因爲prvalue是一個值,你可以說,價值獲取評估,儘管這是一種pleonastic。