variable bool c++ boolean complement

c++ - variable - ¿Por qué el operador del complemento no funciona cuando bool=true?



bool variable c++ (4)

He escrito este programa en C ++ y no puedo entender por qué se está imprimiendo 1 en la tercera declaración cout .

#include<iostream> using namespace std; int main() { bool b = false; cout << b << "/n"; // Print 0 b = ~b; cout << b << "/n"; // Print 1 b = ~b; cout << b << "/n"; // Print 1 **Why?** return 0; }

Salida:

0 1 1

¿Por qué no se imprime lo siguiente?

0 1 0


Como prácticamente todos los demás han dicho, el bool se está promoviendo a un entero antes de que el operador del complemento haga su trabajo. ~ es un operador bitwise y por lo tanto invierte cada bit individual del entero; si aplica ~ a 00000001, el resultado es 11111110. Cuando lo aplica a un entero con signo de 32 bits, ~ 1 le da -2. Si estás confundido por qué, solo echa un vistazo a un convertidor binario. Por ejemplo: http://www.binaryconvert.com/result_signed_int.html?decimal=045050

A su pregunta revisada:

Falso a verdadero funciona por la misma razón que arriba. Si volteas 00000000 (hasta 32 bits), obtienes 11111111 ... lo cual creo que es -1 en entero. Cuando se comparan valores booleanos, todo lo que es -not- 0 se considera verdadero, mientras que 0 solo es falso.


Debe utilizar operadores lógicos, no operadores binarios. Utilizar ! en lugar de ~ .


Esto se debe a la mecanización del operador heredado de C (también se recuerda que ~ es un complemento a nivel de bits ). Los operandos integrales a ~ se promueven a int antes de realizar la operación, y luego se convierten de nuevo a bool . Entonces, efectivamente, lo que está obteniendo es (usando una representación sin signo de 32 bits) false -> 0 -> 0xFFFFFFFF -> true . Entonces true -> 1 -> 0xFFFFFFFE -> 1 -> true .

Estás buscando el ! Operador para invertir un valor booleano.


Probablemente quieras hacer esto:

b = !b;

que es la negación lógica. Lo que hizo es la negación a nivel de bits de una bool a un entero. La segunda vez la declaración b = ~b; se ejecuta, el valor anterior de b es true . Convertir a un número entero, esto da 1 cuyo complemento a nivel de bits es -2 y, por lo tanto, volver a bool true . Por lo tanto, true valores true de b seguirán siendo true mientras que false valores false se asignarán true . Esto se debe al legado de C.