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

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

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

Ответ 1

Да:

В С++ (§4.5/4):

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

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

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

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

Ответ 2

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

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

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

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

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

.

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

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

Ответ 3

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

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 способами, описанными в этом международном стандарте как "undefined", например, посредством изучения значения неинициализированного автоматического объекта, может привести к тому, что он будет вести себя так, как если бы он не был true и false.

Ответ 4

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

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

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

  255 is true

Будет добавлен в пример FredOverflow.

Ответ 5

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

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

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