Тайна с типом данных bool - PullRequest
2 голосов
/ 18 октября 2011
#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 store 1 бит, тогда почему sizeof (bool) равен 1 байту?

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

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

Ответы [ 3 ]

14 голосов
/ 18 октября 2011

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

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

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

1 голос
/ 18 октября 2011

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

0 голосов
/ 18 октября 2011

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

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

...