2012-12-12 12 views
12

Mögliche Duplizieren:
Double Negation in C++ codeWarum zwei '!' Operatoren auf einem booleschen Wert?

Wenn ich das Webkit-Quellcode gescannt, ich eine seltsame Verwendung des boolean "nicht" Operator ! gefunden:

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

Warum verwenden sie nicht enabled direkt anstelle von !!enabled?

+1

Nichts hier erwähnt explizit, aber die 'BOOL' ist höchstwahrscheinlich eine ganze Zahl von einer Art. Gemessen an "SUCCEEDED" nehme ich Winapi an, in dem es "int" ist. – chris

Antwort

5

Es soll einen Wert auf einen booleschen Wert setzen. Also, wenn der Wert zu etwas auswertet, werden Sie wahr werden.

1

Wahrscheinlich continuousSpellCheckingEnabled ist vom Typ Bool. BOOL wird als int definiert, so:

continuousSpellCheckingEnabled = enabled; 

gibt eine Warnung aus, während:

continuousSpellCheckingEnabled = !!enabled; 

nicht.

+0

+1 zur Erklärung * warum * es notwendig sein könnte, in {0,1} zu konvertieren – OrangeDog

1

warum nicht sie direkt verwenden "aktiviert"

Doppel Negation aufhebt nur für Boolesche Werte aus (0 und 1) so !!(0) == 0 für nicht-Boolesche Werte wird der Wert konvertiert werden, um boolean !!(100) == 1

14

Es ist ein C++ Trick etwas 1 oder 0 zu konvertieren.

Zum Beispiel 42 logisch true ist, ist aber nicht 1, so !! darauf anwenden, Sie schalten Sie ihn in 1.

4

Es zwingt ein wahrer Wert genau 1.

In einem booleschen Kontext zu sein (if (x), while (x), x ? a : b, for (; x;)), ein Wert, der 0 bedeutet falsch ist, während jeder andere Wert true bedeutet.

Wenn Ihre Funktion einen Wahrheitswert akzeptiert, aber Sie müssen genau 1 dort, !! ist in Ordnung.

Mit anderen Worten, ist !!x die gleiche wie x ? 1 : 0.

Verwandte Themen