Qué portátil es esta conversión. ¿Puedo estar seguro de que ambas afirmaciones pasan?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
No preguntes por qué. Sé que es feo. Gracias.
int x = 4<5;
Completamente portátil. Conforme estándar. bool
a la int
conversión está implícito!
§4.7 / 4 del estándar C ++ dice ( Conversión integral )
Si el tipo de fuente es bool, el valor
false
se convierte a cero y el valortrue
se convierte a uno .
En cuanto a C, por lo que yo sé que no hay bool
en C. (antes de 1999) Así bool
que int
la conversión es relevante en C ++ solamente. En C, se 4<5
evalúa como int
valor, en este caso el valor es 1
, 4>5
se evaluaría como 0
.
EDITAR: Jens en el comentario dijo, C99 tiene _Bool
tipo. bool
es una macro definida en el stdbool.h
archivo de encabezado. true
y false
también están definidos en macro stdbool.h
.
El § 7.16 del C99 dice:
La macro se
bool
expande a _Bool.[..]
true
que se expande a la constante entera1
,false
que se expande a la constante entera0
, [..]
bool
en C desde 1999. Simplemente use el encabezado "stdbool.h" y esto debería incluirse.
bool
/ _Bool
type, los operadores relacionales en C producen int
, no bool
. Es decir, incluso en C99, los operadores relacionales todavía producen int
.
Etiquetó su pregunta [C] y [C ++] al mismo tiempo. Los resultados serán consistentes entre los idiomas, pero la estructura de la respuesta es diferente para cada uno de estos idiomas.
En lenguaje C, sus ejemplos no tienen ninguna relación con bool
eso (eso también se aplica a C99). En lenguaje C, los operadores relacionales no producen bool
resultados. Ambos 4 > 5
y 4 < 5
son expresiones que producen resultados de tipo int
con valores 0
o 1
. Por lo tanto, no hay "conversión de bool a int" de ningún tipo en sus ejemplos en C.
En C ++, los operadores relacionales sí producen bool
resultados. bool
los valores son convertibles a int
tipo, con true
conversión a 1
y false
conversión a 0
. Esto está garantizado por el idioma.
El lenguaje PS C también tiene un tipo booleano dedicado _Bool
(macro-alias como bool
), y sus reglas de conversión integral son esencialmente las mismas que en C ++. Sin embargo, esto no es relevante para sus ejemplos específicos en C. Una vez más, los operadores relacionales en C siempre producen int
(no bool
) resultados independientemente de la versión de la especificación del lenguaje.
bool
en C99, los operadores relacionales todavía producen int
en C99, no bool
. Entonces, si le interesan específicamente los operadores relacionales (como en sus ejemplos), el problema aún no tiene nada que ver bool
.
int
, no un bool
. No ocurre conversión.
bool
pero no permite que se tome su dirección? Muchos sistemas integrados hacen uso de tales tipos (a menudo declarados utilizando el identificador bit
). Por ejemplo, en un PIC de rango medio, if (bitVar1) bitVar2=1;
serían dos instrucciones; la codificación óptima if (byteVar1) byteVar2=1;
sería de al menos cuatro (en muchos compiladores, probablemente cinco). Tales tipos pueden ofrecer un gran aumento de rendimiento.
La sección 6.5.8.6 del estándar C dice:
Cada uno de los operadores <(menor que),> (mayor que), <= (menor o igual que) y> = (mayor o igual que) producirá 1 si la relación especificada es verdadera y 0 si es falso.) El resultado tiene el tipo int.
Parece que no hay ningún problema ya que el int to bool cast se realiza implícitamente. Esto funciona en Microsoft Visual C ++, GCC y el compilador Intel C ++. No hay problema en C o C ++.
assert(x!=0)
. Incluso si bool (true) convierte portable a int (1), las afirmaciones "no falsas" tienen una expresión más legible.assert( 4 < 5);
yassert(!( 4 > 5));
(4 < 5) ? 1 : 0
si realmente necesito convertir un booleano a 0 o 1. Un buen compilador probablemente producirá el mismo código de máquina y es más claro para un lector humano.