bool a la conversión int

¿Qué tan portátil es esta conversión? ¿Puedo estar seguro de que ambas afirmaciones pasan?

int x = 45; assert(x==0); 

No preguntes por qué. Sé que es feo. Gracias.

 int x = 4<5; 

Completamente portátil. Estándar conforme. bool conversión de bool a int está implícita!

§4.7 / 4 del Estándar C ++ dice ( Conversión Integral)

Si el tipo de fuente es bool, el valor false se convierte en cero y el valor true se convierte en uno .


En cuanto a C, hasta donde sé, no hay bool en C. (antes de 1999). Así, la conversión de bool a int es relevante sólo en C ++. En C, 4<5 evalúa a valor int , en este caso el valor es 1 , 4>5 evaluaría a 0 .

EDITAR: Jens en el comentario dijo, C99 tiene _Bool tipo. bool es una macro definida en el archivo de encabezado stdbool.h true y false también se definen en macro en stdbool.h .

§7.16 de C99 dice,

El macro bool expande a _Bool.

[..] true que se expande a la constante 1 entera, false que se expande a la constante entera 0 , [..]

Etiquetaste tu 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 el lenguaje C, sus ejemplos no tienen ninguna relación con bool absoluto (eso también se aplica a C99). En el lenguaje C, los operadores relacionales no producen resultados bool . Tanto 4 > 5 como 4 < 5 son expresiones que producen resultados de tipo int con valores 0 o 1 . Por lo tanto, no hay ninguna "conversión de bool a int" de ningún tipo en sus ejemplos en C.

En C ++ los operadores relacionales sí producen resultados bool . bool valores bool son convertibles a tipo int , con la conversión true a 1 y la conversión false a 0 . Esto está garantizado por el lenguaje.

El lenguaje PS C también tiene un tipo booleano dedicado _Bool (con _Bool como bool ), y sus reglas de conversión integrales 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 resultados int (no bool ) independientemente de la versión de la especificación del lenguaje.

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 que o igual a) rendirá 1 si la relación especificada es verdadera y 0 si es falso.) El resultado tiene tipo int.

No parece haber ningún problema ya que el int a boolcast se realiza implícitamente. Esto funciona en Microsoft Visual C ++, GCC y el comstackdor Intel C ++. No hay problema en C o C ++.