variable usar type dato como booleano bool c++ c boolean

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 son true o false . El uso de un valor de bool 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 ni true ni false .


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 .