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.