簡體   English   中英

鑄造價值的魔力布爾

[英]Magic of casting value to bool

今天我意識到為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 ++行為嗎?

這沒有什么神奇之處。 intunsigned char的轉換定義為value % 256 (對於8位char ),這就是你得到的。 它可以實現為復制LSB,但你仍然應該在語義意義上考慮它,而不是實現。

同樣,將int轉換為bool定義為value != 0 ,所以再次,這就是你得到的。

[conv.integral][conv.bool]的C ++ 11標准涵蓋了積分(和布爾)轉換。 對於C風格的演員表,請參閱[expr.cast][expr.static.cast]

是的,當轉換為bool ,將評估值,而不是復制。

實際上,在您的示例中,只要value不為0b就為true

更新:從C ++ Primer第5版第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.

它是標准的一部分:

4.12布爾轉換[conv.bool]

1算術,無范圍枚舉,指針或指向成員類型的指針的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。 類型為std :: nullptr_t的prvalue可以轉換為bool類型的prvalue; 結果值為false。

根據C風格的強制轉換規則(bool)value實際上是static_cast static_cast的第一個規則然后開始,它計算臨時“聲明和初始化的值......如new_type Temp(expression); ”,即bool Temp(value); 這是明確定義的:如果value != 0 Temptrue value != 0 所以是的, value在某種意義上是“評估”的。

轉換為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!
}

ISO / IEC C ++標准:

4.12布爾轉換[conv.bool] 1算術...類型的prvalue可以轉換為bool類型的prvalue。 零值...轉換為false; 任何其他值都轉換為true。

因此,由於prvalue是一個值,你可能會說該值得到了評估,盡管這是一種多樣性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM