2012-01-17 15 views
15

Duplicar posibles:
Double Negation in C++ code¿Cuál es el uso de "!!" (negando dos veces)?

Digamos:

bool var = !!true; 

Se asignará "verdadero" a la variable. Parece inútil, pero yo estaba buscando en la definición de Visual Studio de "valer", y es:

#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)) 

¿Por qué se niega la "expresión de la época" dos veces?

Me pregunto si quieren forzar el "!" operador a llamar (en el caso de que esté sobrecargado), pero eso no parece ser una buena razón.

+0

Buena pregunta, +1 – jlledom

+1

http://stackoverflow.com/questions/248693/double-negation-in-c-code – cnicutar

+0

http://stackoverflow.com/questions/1310344/why-use-when-converting -int-to-bool – cnicutar

Respuesta

7

!! garantiza que el resultado terminará en 1 o 0, en lugar de solo el valor de _Expression o 0. En C, es poco probable que importe, pero en C++ creo que convierte el resultado de la expresión en un tipo bool, que podría ser útil en algunos casos. Si tuviera alguna API que requiriera que se le pasara 1 o 0 literal, usar !! sería una forma de hacerlo realidad.

1

Su uso es para asegurarse de que el valor sea 0 o 1. Creo que es superfluo con el tipo bool de C++.

4

Es posible que es posible que desee una variable int que es ya sea 1 o 0.

Así que no puede, por ejemplo, pasar un 5, en cambio, la doble negación convertiría ese 5 en un 1.

También, echar un vistazo a cómo se define TRUE:

#ifndef TRUE 
#define TRUE    1 
#endif 

Por lo tanto, una expresión como:

int x = 5; 
if (x == TRUE) 
{ 
    //.... 
} 

no pasaría, mientras que

if (x) 
{ 
    //.... 
} 

haría.