c++ - true - if c
¿Puedo suponer(bool) verdadero==(int) 1 para cualquier compilador de C++? (5)
De acuerdo con el estándar, deberías estar seguro con esa suposición. El tipo C ++ bool
tiene dos valores: true
y false
con los valores correspondientes 1 y 0.
Lo que hay que tener en cuenta es mezclar expresiones bool
y variables con expresión BOOL
y variables. Este último se define como FALSE = 0
y TRUE != FALSE
, lo que a menudo en la práctica significa que cualquier valor diferente de 0 se considera TRUE
.
Muchos compiladores modernos emitirán una advertencia para cualquier código que implícitamente intente BOOL
de BOOL
a bool
si el valor BOOL
es diferente de 0 o 1.
¿Puedo suponer (bool)true == (int)1
para cualquier compilador de C ++?
He encontrado diferentes compiladores que arrojan resultados diferentes en verdadero. También encontré que casi siempre es mejor comparar un bool con un bool en lugar de un int. Esos puntos tienden a cambiar de valor a medida que su programa evoluciona y si usted asume que son verdaderos como 1, puede ser mordido por un cambio no relacionado en otro lugar de su código.
La respuesta de Charles Bailey es correcta. La redacción exacta del estándar de C ++ es (§4.7 / 4): "Si el tipo de fuente es bool, el valor falso se convierte en cero y el valor verdadero se convierte en uno".
Editar: veo que también ha agregado la referencia; lo eliminaré en breve, si no me distraigo y olvido ...
Edit2: Por otra parte, es probable que valga la pena señalar que mientras que los valores booleanos siempre convierten a cero o uno, varias funciones (especialmente de la biblioteca estándar C) devuelven valores que son "básicamente booleanos", pero representados como int
s que normalmente solo se requiere que sean cero para indicar falso o distinto de cero para indicar verdadero. Por ejemplo, las funciones is * en <ctype.h>
solo requieren cero o distinto de cero, no necesariamente cero o uno.
Si lanzas eso a bool
, cero convertirá a falso, y no cero a verdadero (como es de esperar).
No, TRUE puede ser arbitrario entre los compiladores. Algunos usarán 1, algunos -1 (todos los bits configurados, var firmada), otros compiladores pueden usar un valor diferente. Incluso si el valor está estandarizado, no todos los compiladores pueden seguir el estándar.
FALSO, sin embargo, es cuando todos los bits son claros, lo que solo ocurre para el valor numérico 0.
Sí. Los moldes son redundantes. En tu expresión:
true == 1
Se aplica promoción integral y el valor de bool se promocionará a int
y esta promoción debe generar 1.
Referencia: 4.7 [conv.integral] / 4: si el tipo de fuente es bool
... true
se convierte en uno.