c++ - last - c11 compiler
bool a la conversión int (4)
¿Qué tan 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.
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 compilador Intel C ++. No hay problema en C o C ++.
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 valortrue
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 constante1
entera,false
que se expande a la constante entera0
, [..]