Всегда ли тип bool в C / C ++ всегда гарантированно равен 0 или 1, если тип приведен к int? - PullRequest
42 голосов
/ 25 ноября 2010

Многие компиляторы, похоже, сохраняют только 0 или 1 в значениях bool, но я не уверен, что это всегда будет работать:

int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?

Ответы [ 6 ]

47 голосов
/ 25 ноября 2010

Да:

В C ++ (§4.5 / 4):

Значение типа bool может быть преобразовано в значение типа int, при этом значение false становится равным нулю, а значение trueстановится единицей.

В C, когда значение преобразуется в _Bool, оно становится 0 или 1 (§6.3.1.2 / 1):

Когда любоескалярное значение преобразуется в _Bool, результат равен 0, если значение сравнивается равным 0;в противном случае результат равен 1.

При преобразовании в int это довольно просто.int может содержать 0 и 1, поэтому значения не меняются (§6.3.1.3).

19 голосов
/ 25 ноября 2010

Ну, не всегда ...

const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
    int x = b[i];
    if (x & ~1)
    {
        std::cout << x << ' ';
    }
}

Вывод в моей системе:

28 255 34 148 92 192 119 46 165 192 119 232 26 195 119 44 255 34 96 157 192 119
8 47 78 192 119 41 78 192 119 8 250 64 2 194 205 146 124 192 73 64 4 255 34 56 2
55 34 224 255 34 148 92 192 119 80 40 190 119 255 255 255 255 41 78 192 119 66 7
8 192 119 192 73 64 240 255 34 25 74 64 192 73 64

Причина этого, по-видимому, странного вывода изложена в стандарте, 3.9.1 §6:

Значения типа bool являются либо true, либо false. Использование значения bool способами, описанными в этом международном стандарте как «неопределенные», например, путем проверки значения неинициализированного автоматического объекта, может привести к тому, что он будет вести себя так, как если бы он не был true или false .

18 голосов
/ 25 ноября 2010

Является ли C / C ++ .......

Нет языка с именем C / C ++.

тип bool всегда гарантированно равен 0 или 1, если тип приведен к int?

В C ++ да, потому что в разделе $ 4.5 / 4 написано

Значение r типа bool может быть преобразовано в значение типа int, где false становится равным нулю, а true становится единым.

.

int c = 3 + b; // 4 или 5?

Значение c будет 4

8 голосов
/ 23 апреля 2013

Еще один пример, когда вы вышли из безопасной лодки:

  bool b = false;
  *(reinterpret_cast<char*>(&b)) = 0xFF;
  int from_bool = b;
  cout << from_bool << " is " << (b ? "true" : "false");

Вывод (г ++ (GCC) 4.4.7):

  255 is true

Для добавления к примеру FredOverflow .

3 голосов
/ 25 ноября 2010

В C pre C99 нет типа bool (например, C90), однако тип bool в C99 / C ++ всегда гарантированно равен 0 или 1.

В C все логические операции гарантированновозвращает либо 0, либо 1, независимо от того, определен ли тип bool.

Итак, a && b или !a или a || b всегда будут возвращать 0 или 1 в C или C ++ независимо от типа a и b.

1 голос
/ 09 ноября 2018

Типы с битами заполнения могут вести себя странно, если биты заполнения не содержат значений, ожидаемых для типа.В большинстве реализаций C89 биты заполнения не используются ни с одним из целочисленных типов, но C99 требует, чтобы реализации определяли такой тип: _Bool.Чтение _Bool, когда все его биты равны нулю, даст ноль.Запись любого ненулевого значения в _Bool установит его биты в некоторый шаблон, который даст 1 при чтении.Запись в ноль установит биты в шаблон (который может быть или не быть все-бит-ноль), который при чтении даст 0.

Если в документации реализации не указано иное, любой битовый шаблон, кроме всехбиты ноль, которые не могли быть получены путем сохранения нулевого или ненулевого значения в _Bool, представляют собой представление ловушки;Стандарт ничего не говорит о том, что произойдет, если будет предпринята попытка прочитать такое значение.Учитывая, например,

union boolChar { _Bool b; unsigned char c; } bc;

с сохранением нуля до bc.c и чтением bc.b даст ноль.Сохранение нуля или единицы в bc.b установит bc.c в значения, которые, если они будут записаны, приведут к тому, что bc.b будет содержать ноль или единицу.Сохранение любого другого значения в bc.c и чтение bc.b приведут к неопределенному поведению.

...