2011-10-05 88 views
6

考慮下面的C++代碼:總結布爾值/ C++

bool a = 5; 
bool b = 6; 
int c = (int)a + (int)b; 

當我編譯&運行該代碼,c具有值2是否標準保證的是,在任何編譯器/平臺,布爾使用false(0)或true(不一定爲1)初始化的值在操作中將爲1,並且上面的代碼總是會導致c爲2?

而在C99,包括stdbool.h,是仍然有效?

+1

我想你答案就在這裏:http://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any-c-compiler –

+2

IMO,如果分配不是真正的以外的東西/假的布爾變量它應該代碼審查回你。 – Max

+0

我只有一個詞:爲什麼? –

回答

10

C++標準的4.7節(整數版本)表示:

如果源類型是布爾,值被轉換爲 零和值被轉換爲一。

4.9節使浮點轉換相同的質量保證。

+0

謝謝,C++的這個答案,但是對C99(與stdbool)也是有效的嗎? – fbafelipe

1

對於編譯器,規則往往是假的爲0,任何東西都不會是真實的。但是,像這樣處理bool是一個整數類型通常被認爲是不好的形式。然而,標準包含一個轉換爲int的規則,並且只要編譯器符合標準,假設是正確的false = 0和true = 1!

在任何情況下,爲什麼算術與布爾類型?

希望這有助於

+0

Arichmetic與bool類型可以用來編寫更少的代碼,所以你可以寫x + = a ;,而不是x + =(a?1:0);。 – fbafelipe

+0

爲什麼不使用x | = a;甚至x = x ||一個;所有好的和尊重的基礎類型 – Martin

+0

如果x是一個整數,計算有多少(的一組布爾)是真的?我知道有辦法解決問題,但由於這看起來更簡單,所以我在問這個問題,以確定它是否會始終有效。 – fbafelipe

1

依據標準:

  • true轉換爲1
  • false轉換爲0

他投來int是沒有必要的轉換到int是隱含的。

1

David Schwartz已經爲C++回答了。對於C99標準,我們有6.3.1.4:

當任何標量值轉換爲_Bool,結果是0,如果 值進行比較等於0;否則,結果爲1

由於標準的6.3.1.1也清楚地表明,_Bool受到整型的提升很明顯,一個_Bool永遠是0或1