usar - ¿C/C++ bool type siempre garantiza ser 0 o 1 cuando typecast''ed a int?
dato booleano en c++ (5)
Muchos compiladores parecen mantener solo 0 o 1 en valores de bool, pero no estoy seguro de que esto funcione siempre:
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
Es C / C ++ .......
No hay un lenguaje llamado C / C ++.
¿tipo bool siempre garantiza ser 0 o 1 cuando typecast''ed a int?
En C ++ sí, porque la sección $ 4.5 / 4 dice
Un rvalue de tipo bool se puede convertir a un rvalue de tipo int, con falso convirtiéndose en cero y verdadero convirtiéndose en uno.
.
int c = 3 + b;
// 4 o 5?
El valor de c será 4
Bueno, no siempre ...
const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
int x = b[i];
if (x & ~1)
{
std::cout << x << '' '';
}
}
Salida en mi sistema:
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
La razón de este resultado aparentemente extraño se presenta en la norma, 3.9.1 §6:
Los valores de tipo
bool
sontrue
ofalse
. El uso de un valor debool
en formas descritas por esta Norma Internacional como "indefinidas", como al examinar el valor de un objeto automático no inicializado, puede hacer que se comporte como si no fuera nitrue
nifalse
.
No hay ningún tipo de bool en C pre C99 (como C90), sin embargo, el tipo de bool en C99 / C ++ siempre garantiza que sea 0 o 1.
En C, se garantiza que todas las operaciones booleanas devuelven 0 o 1, independientemente de si el tipo de bool está definido o no.
Entonces a && b
o !a
o a || b
a || b
siempre devolverá 0 o 1 en C o C ++, independientemente del tipo de b
.
Sí:
En C ++ (§4.5 / 4):
Un rvalue de tipo bool se puede convertir a un rvalue de tipo int, con falso convirtiéndose en cero y verdadero convirtiéndose en uno.
En C, cuando un valor se convierte en _Bool
, se convierte en 0 o 1 (§6.3.1.2 / 1):
Cuando cualquier valor escalar se convierte a _Bool, el resultado es 0 si el valor se compara con 0; de lo contrario, el resultado es 1.
Al convertir a int
, es bastante directo. int
puede contener 0 y 1, por lo que no hay cambio en el valor (§6.3.1.3).
Un ejemplo más cuando estás fuera del barco seguro:
bool b = false;
*(reinterpret_cast<char*>(&b)) = 0xFF;
int from_bool = b;
cout << from_bool << " is " << (b ? "true" : "false");
Salida (g ++ (GCC) 4.4.7):
255 is true
Para ser agregado al ejemplo de FredOverflow .