2012-01-17 9 views
15

Eventuali duplicati:
Double Negation in C++ codeQual è l'utilizzo di "!!" (negando due volte)?

Diciamo:

bool var = !!true; 

assegnerà "vero" alla variabile. Sembra inutile, ma stavo guardando la definizione di Visual Studio di "affermare", ed è:

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

Perché si nega il "_Expression" due volte?

Mi chiedo che vogliono forzare il "!" operatore da chiamare (nel caso sia sovraccarico), ma ciò non sembra essere una buona ragione.

+0

Buona domanda, +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

risposta

7

!! garantisce che il risultato sarà come 1 o 0, anziché solo il valore di _Expression o 0. In C, è improbabile che importi, ma in C++ penso che converta il risultato dell'espressione in un tipo bool, che potrebbe essere utile in alcuni casi. Se si ha avuto alcune API che ha richiesto un letterale 1 o 0 essere passato ad esso, utilizzando !! sarebbe un modo per farlo accadere.

1

Il suo utilizzo è quello di assicurarsi che il valore è 0 o 1. Credo che sia superfluo con il tipo bool C++ 's.

4

È possibile che si desideri una variabile int che sia 1 o 0.

Quindi non è possibile ad esempio passare un 5, invece la doppia negazione trasformerebbe tale 5 in un 1.

Inoltre, avere uno sguardo a come TRUE è definito:

#ifndef TRUE 
#define TRUE    1 
#endif 

Pertanto, un'espressione come:

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

non sarebbe passata, mentre

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

avrebbe fatto.