Многие компиляторы, похоже, сохраняют только 0 или 1 в значениях bool, но я не уверен, что это всегда будет работать:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
Многие компиляторы, похоже, сохраняют только 0 или 1 в значениях bool, но я не уверен, что это всегда будет работать:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
Да:
В С++ (§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).
Является C/С++.......
Нет языка с именем C/С++.
Тип bool всегда должен быть 0 или 1, если typecast'ed для int?
В С++ да, потому что раздел $4.5/4 говорит
Значение типа 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
способами, описанными в этом международном стандарте как "undefined", например, посредством изучения значения неинициализированного автоматического объекта, может привести к тому, что он будет вести себя так, как если бы он не былtrue
иfalse
.
Еще один пример, когда вы находитесь вне безопасной лодки:
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.
В C pre C99 нет типа bool (например, C90), однако тип bool в C99/С++ всегда будет равен 0 или 1.
В C все логические операции гарантированно возвращают либо 0, либо 1, определяется ли тип bool или нет.
So a && b
или !a
или a || b
всегда будут возвращать 0 или 1 в C или С++ независимо от типа a
и b
.