variable values bool c++ c casting boolean

c++ - values - boolean variable



Casting int to bool en C/C++ (2)

Sé que en C y C ++, al convertir bools en ints, (int)true == 1 y (int)false == 0 . Me pregunto sobre el casting en la dirección opuesta ...

En el siguiente código, todas las afirmaciones siguientes se mantuvieron verdaderas para mí en archivos .c compilados con Visual Studio 2013 y Keil μVision 5. Notice (bool)2 == true .

¿Qué dicen los estándares de C y C ++ sobre el envío de enteros distintos de cero, no uno a bools? ¿Este comportamiento está especificado? Por favor incluya citas.

#include <stdbool.h> #include <assert.h> void TestBoolCast(void) { int i0 = 0, i1 = 1, i2 = 2; assert((bool)i0 == false); assert((bool)i1 == true); assert((bool)i2 == true); assert(!!i0 == false); assert(!!i1 == true); assert(!!i2 == true); }

No es un duplicado de ¿Puedo asumir (bool) verdadero == (int) 1 para cualquier compilador de C ++? :

  1. Casting en la dirección inversa (int -> bool).
  2. No hay discusión sobre valores distintos de cero, no uno.

0 valores de tipos básicos (1) (2) mapean a false .

Otros valores se asignan a true .

Esta convención se estableció en C original, a través de sus declaraciones de control de flujo; C no tenía un tipo booleano en ese momento.

Es un error común suponer que como valores de retorno de función, false indica falla. Pero en particular de main es false que indica éxito. He visto esto mal muchas veces, incluso en el código de inicio de Windows para el lenguaje D (cuando personas como Walter Bright y Andrei Alexandrescu se equivocan, entonces es muy fácil equivocarse), de ahí este aviso ten cuidado, ten cuidado.

No hay necesidad de lanzar a bool para los tipos incorporados porque esa conversión es implícita. Sin embargo, Visual C ++ (compilador C ++ de Microsoft) tiene una tendencia a emitir una advertencia de rendimiento (!) Para esto, una advertencia tonta pura. Un elenco no es suficiente para apagarlo, pero una conversión por doble negación, es decir, return !!x , funciona muy bien. ¡Uno puede leer !! como un operador "convertir a bool ", tanto como --> se puede leer como "va a". Para aquellos que están profundamente en la legibilidad de la notación del operador. ;-)

1) C ++ 14 §4.12 / 1 "Un valor cero, valor de puntero nulo o valor de puntero de miembro nulo se convierte en false ; cualquier otro valor se convierte en true . Para la inicialización directa (8.5), un prvalue de tipo std::nullptr_t se puede convertir a un prvalue de tipo bool ; el valor resultante es false ".
2) C99 y C11 §6.3.1.2 / 1 "Cuando cualquier valor escalar se convierte en _Bool , el resultado es 0 si el valor se compara con 0; de lo contrario, el resultado es 1. "


Lo siguiente cita el estándar C11 (borrador final).

6.3.1.2: 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.

bool (asignado por stdbool.h al nombre interno _Bool for C) en sí es un tipo entero sin signo :

... El tipo _Bool y los tipos enteros sin signo que corresponden a los tipos enteros con signo estándar son los tipos enteros sin signo estándar.

De acuerdo con 6.2.5p2 :

Un objeto declarado como tipo _Bool es lo suficientemente grande como para almacenar los valores 0 y 1.

AFAIK estas definiciones son semánticamente idénticas a C ++, con la menor diferencia de los nombres integrados (!). bool para C ++ y _Bool para C.

Tenga en cuenta que C no utiliza el término rvalues como lo hace C ++. Sin embargo, en C los punteros son escalares , por lo que la asignación de un puntero a un _Bool comporta como en C ++.