2011-10-18 37 views
2
#include <stdio.h> 
#include <stdbool.h> 

int main() 
{ 
bool a[5]={0,1,0,0,0}; 
a[1]=3; 
printf("\n bool is %d",a[1]); 
printf("\n sizeof bool is %d and size of a is %d",sizeof(bool),sizeof(a)); 

bool b[10]; 
printf("\n bool is %d",b[1]); 

} 

該程序的輸出是推理與布爾數據類型

bool is 1 
sizeof bool is 1 and size of a is 5 
bool is 4 

問題:

1> BOOL存儲1位,那麼爲什麼的sizeof(布爾)是1個字節?

2>如果布爾有1個字節,那麼當我分配[1] = 3時,爲什麼它打印1?

3>如果bool僅考慮1 & o要存儲的值那麼爲什麼b [1]打印值3?

回答

14

1>布爾商店不是1位。沒有什麼是1位。一切都至少有1個字節。 sizeof(bool)是平臺特定的。僅sizeof(char)保證是1.

2>它隱式轉換intbool(bool)3 == 1

3>陣列b沒有被初始化,它可以具有任何值。你只是在訪問一些內存。

+0

清除並清除,除了一個疑問, 存儲內存中的字節將爲'00000001'或'11111111'爲1? – kAmol

+0

「一切都至少有1個字節」 - >在結構中的字段呢? – chux

0

在C中沒有真正的布爾類型。 C解釋一個整數意味着false,如果它是0並且其他所有內容都爲真。即使bool只需要一位,實際上也不會使用它,因爲大多數體系結構中最小的可尋址單元是一個字節。除了掩飾一個字節中除了一位之外的路線之外,我使用了上面解釋的方法。

您正在使用來自C99的stdbool.h,該文件提供了typedef bool和宏truefalse。宏分別擴展爲0和1,但使源更具描述性。 sizeof是實現定義的,不能依賴它在不同平臺上相同。

+2

除了C89之外,C還有更多。 –

+0

@Luc我爲'stdbool.h'添加了一個段落 – pmr

+0

它被標記爲C++和C,所以大概是來自stdbool.h的bool名稱與來自C++的實際布爾類型「bool」相沖突... – Benj

1

最後一個printf打印出4的原因是因爲b數組未被初始化,這意味着printf函數只是使用內存中已有的任何值。