2013-04-24 2 views
30

Ho un codice C++ che fa ampio uso di !!. Sono un po 'sconcertato perché, per quanto ne so, lo !! non è un operatore da solo ma due ! uno dopo l'altro. Ciò significherebbe che lo !!foo è lo stesso del solo foo.Confuso dall'uso del doppio operatore logico (!!)

Esiste un luogo o un motivo quando lo standard !! ha effettivamente senso? Stavo pensando se potrebbe forse avere un significato un po 'saggio? Quindi per prima cosa esegui qualche operazione di saggio su foo e poi ! sul risultato? Ma non mi sembra di ricordare che lo ! sia usato come un operatore un po 'saggio e non sembra trovare alcun riferimento a dirmi che lo è. Per quanto posso dire ! nel utilizzato solo come un operatore logico e in quel caso

!!foo == foo

+4

Si può anche scrivere 'x +++++ y + 1', ma è una cattiva idea. – msw

+0

@GrahamBorland Ora ho intenzione di andare là e votarlo come un duplicato di questo. –

+0

Ti potrebbe interessare anche leggere questo: [* cosa è !! in c? *] (http://stackoverflow.com/questions/14751973/what-is-in-c?lq=1). –

risposta

45

Non è semplice come la doppia negazione. Ad esempio, se si dispone di x == 5, quindi applicarne due! operatori (!!x), diventerà 1 - quindi, viene utilizzato per la normalizzazione dei valori booleani nell'intervallo {0, 1}.

Si noti che è possibile utilizzare zero come booleano falso e non zero per booleano vero, ma potrebbe essere necessario normalizzare il risultato in uno 0 o 1, e questo è quando !! è utile.

È lo stesso di x != 0 ? 1 : 0.

Inoltre, notare che questo non è vero sefoo non è in {0, 1} set:

!!foo == foo

#include <iostream> 

using namespace std; 

int main() 
{ 
     int foo = 5; 

     if(foo == !!foo) 
     { 
       cout << "foo == !!foo" << endl; 
     } 
     else 
     { 
       cout << "foo != !!foo" << endl; 
     } 



     return 0; 
} 

Stampe foo != !!foo.

+2

Ahhh thanx ... Questo ha perfettamente senso – inquam

+0

quali potrebbero essere i possibili casi d'uso per questo? –

+3

Supponiamo di avere un posto dove un bool viene memorizzato come 1 o 0, in un bit o qualcosa del genere. E il valore che controlli è 5 (che sarebbe valido come vero), puoi sostanzialmente trasformare quel 5 in 1. – inquam

4

se foo != 0, quindi !!foo == 1. È fondamentalmente un trucco per convertire in bool.

+1

'1' non è un' bool'. È un 'int'. –

+1

@Kerrek SB Lo so, mi riferisco al valore attuale. –

8

Può essere utilizzato come abbreviazione per trasformare foo in un'espressione booleana. Potresti voler trasformare un'espressione non booleana in vero o falso esclusivamente per qualche motivo.

foo = !!foo sta per trasformare in foo1 se è diverso da zero, e lasciare a 0 se lo sia già.

3

Se foo non è di tipo bool, allora sarà !!foo. Quindi !!foo può essere 1 o 0.

+0

'0' e' 1' sono 'int's, non' bool's. Stiamo parlando di C++ qui; forse stai confondendo questo con C? –

+0

Hai ragione. Avrei dovuto dire vero o falso. :) –

1

Questa tecnica viene utilizzata per una valutazione sicura di una variabile in un contesto booleano. Se si dispone di una normale conversazione in bool (operator bool()) le variabili non correlate (con tipi diversi) possono partecipare alle espressioni booleane in modo indesiderato. Una definizione di operator! che restituisce un valore booleano negato è implementata. E il suo risultato deve essere nuovamente negato. Basta dare un'occhiata allo Safe bool idiom.