2012-12-12 14 views
12

Eventuali duplicati:
Double Negation in C++ codePerché usare due '!' operatori su un valore booleano?

Quando ho scansionato il codice sorgente Webkit, ho trovato un uso strano del booleano "non" operatore !:

BOOL enabled; 
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled))) 
    continuousSpellCheckingEnabled = !!enabled; 
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled))) 
    grammarCheckingEnabled = !!enabled; 

Perché non usano enabled direttamente invece di !!enabled?

+1

Niente qui lo menziona esplicitamente, ma che 'BOOL' è molto probabilmente un numero intero di qualche tipo. A giudicare da 'SUCCEEDED', presumo winapi, in cui è' int'. – chris

risposta

5

È pensato per forzare un valore su un valore booleano. Quindi se il valore sta valutando qualcosa, diventerai realtà.

1

Molto probabilmente continuousSpellCheckingEnabled è di tipo bool. BOOL è definito come int, quindi:

continuousSpellCheckingEnabled = enabled; 

emette un avvertimento, mentre:

continuousSpellCheckingEnabled = !!enabled; 

non lo fa.

+0

+1 per spiegare * perché * potrebbe essere necessario convertire in {0,1} – OrangeDog

1

perché non usano direttamente "enabled"

doppia negazione annulla solo per i valori booleani (0 e 1) in modo !!(0) == 0 per valori non booleani il valore sarà convertito in boolean !!(100) == 1

14

È un trucco C++ per convertire qualsiasi cosa in 1 o 0.

Per esempio, 42 è logicamente true, ma non è 1, in modo da applicare !! ad esso, che si accende in 1.

4

forza un valore vero di essere esattamente 1.

In un contesto booleano (if (x), while (x), x ? a : b, for (; x;)), un valore che è 0 significa falso, mentre qualsiasi altro valore significa true.

Se la funzione accetta un valore di verità, ma è necessario esattamente 1, !! va bene.

In altre parole, !!x corrisponde a x ? 1 : 0.

Problemi correlati