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.