Тайна с типом данных bool

#include  #include  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 store 1 бит, то почему sizeof (bool) – 1 байт?

2> если bool имеет 1 байт, тогда, когда я назначаю [1] = 3, то почему он печатает 1?

3> Если bool учитывает только значение 1 & o для хранения, то почему b [1] печатает значение 3?

1> Магазин Bool не 1 бит. Ничто не 1 бит. Все не менее 1 байт. sizeof(bool) является специфичным для платформы. Только sizeof(char) гарантированно будет 1.

2> Он неявно преобразует int в bool : (bool)3 == 1

3> массив b не инициализирован, он может иметь любое значение. Вы просто получаете доступ к некоторой памяти.

Причина, по которой последний printf печатает 4, заключается в том, что массив b не инициализирован, что означает, что функция printf просто принимает любое значение уже в памяти.

В C нет реального булева типа. C интерпретирует целое число, означающее false если оно равно 0, а все остальное – как true. Несмотря на то, что для bool потребуется только один бит, это никогда не используется на практике, так как наименьшее адресуемое устройство в большинстве архитектур является байтом. Вместо того, чтобы спускать маршрут маскировки всего одного бита в байте, используется описанный выше подход.

Вы используете stdbool.h из C99, который предоставляет typedef bool и macros true и false . Макросы расширяются до 0 и 1 соответственно, но делают источник более описательным. sizeof – это реализация, и вы не можете полагаться на нее одинаково на разных платформах.