Является ли тип bool типа C / C ++ всегда равным 0 или 1, если typecast’ed для int?

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

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

Да:

В C ++ (§4.5 / 4):

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

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

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

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

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

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

Тип bool всегда должен быть 0 или 1, если typecast’ed для int?

В C ++ да, потому что секция $ 4.5 / 4 говорит

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

,

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

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

Ну, не всегда

 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 .

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

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

Выход (g ++ (GCC) 4.4.7):

  255 is true 

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

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

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

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

  • Autonumber с Entity Framework
  • Каким может быть поведение Nullable в боксе / распаковке?
  • Сериализовать свойство как атрибут Xml в элементе
  • Как отобразить диалог свойств файла с C #?
  • Почему GetType возвращает System.Int32 вместо Nullable ?
  • C ++ Функция Обратные вызовы: невозможно преобразовать из функции-члена в подпись функции
  • ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на маркировку файла -fno-objc-arc
  • Инициализация массива использует переменную const в C ++
  • Структура объекта C ++ в памяти Vs a Struct
  • У .NET есть способ проверить, содержит ли List a все элементы в списке b?
  • К власти в C?
  • Давайте будем гением компьютера.