Gibt es einen Vorteil bei der Verwendung !!(condition) Über (condition)?
Siehe auch dies, dies, dies und viele mehr …
– devnull
4. Januar 2014 um 15:47 Uhr
Oh Mann, tut mir leid!
– Eine Person
5. Januar 2014 um 0:29 Uhr
@Siidheesh es hängt davon ab, wie Sie suchen, meine anfänglichen Suchen haben sie auch nicht aufgedeckt, aber leichte Änderungen später. Ich persönlich finde keinen der Dups, der den Nagel auf den Kopf getroffen hat, so wie der Kernel-Newbies-Thread, den ich gefunden habe, für dieses Nugget, das es wahrscheinlich wert war. Auch Keiths Erklärung ist auch eine weitaus bessere Erklärung als die meisten anderen in den Dups, aber er schreibt normalerweise im Allgemeinen großartige Antworten.
– Shafik Yaghmour
5. Januar 2014 um 1:39 Uhr
Ja, die Suche nach doppelter Verneinung hat funktioniert
– Eine Person
5. Januar 2014 um 2:10 Uhr
Shafik Yaghmur
Nun, wenn die Variable, die Sie anwenden !! ist nicht schon a bool(entweder null oder eins) dann wird es normalisieren der Wert entweder 0 oder 1.
In Gedenken an __builtin_expect Dies Thread für Kernel-Neulinge diskutiert die Notation und eine der Antworten erklärt (Betonung von mir):
Beachten Sie, dass der exp-Parameter ein ganzzahliger Ausdruck sein sollte, also keine Zeiger oder Gleitkommatypen. Das Die doppelte Negation übernimmt die Konvertierung dieser Typen in ganzzahlige Ausdrücke automatisch. Diesen Weg, Sie können einfach schreiben: wahrscheinlich(ptr) statt wahrscheinlich(ptr != NULL).
Zum Nachschlagen in C99bool Makro erweitert zu _Bool, true erweitert sich zu 1 und false erweitert sich zu 0. Die Einzelheiten sind im Normentwurfsteil aufgeführt 7.16Boolescher Typ und Werte .
Die logische Negation wird abgedeckt 6.5.3.3Unäre arithmetische Operatoren im Absatz 5:
Das Ergebnis des logischen Negationsoperators ! ist 0, wenn der Wert seines Operanden ungleich 0 ist, 1, wenn der Wert seines Operanden gleich 0 ist. Das Ergebnis hat den Typ int. Der Ausdruck !E entspricht (0==E).
Keith Thompson
Das Unäre ! logischer Negationsoperator, angewendet auf einen beliebigen Skalar, ergibt die int Wert 0 wenn sein Operand nicht Null ist, 1 wenn der Operand gleich Null ist. Zitieren der Norm:
Der Ausdruck !E ist äquivalent zu (0==E).
Bewirbt sich ! zweimal auf denselben Skalarwert ergibt ein Ergebnis, das falsch ist, wenn der Wert falsch ist, und wahr, wenn der Wert wahr ist – aber das Ergebnis wird normalisiert 0 oder 1beziehungsweise.
In den meisten Fällen ist dies nicht erforderlich, da jeder Skalarwert direkt als Bedingung verwendet werden kann. Aber in manchen Fällen braucht man tatsächlich eine 0 oder 1 Wert.
In C99 oder höher wird der Ausdruck in umgewandelt _Bool (oder zu bool Wenn Sie haben #include <stdbool.h> verhält sich ähnlich und könnte als klarer angesehen werden. Aber (a) das Ergebnis ist vom Typ _Bool statt intund (b) wenn Sie einen Pre-C99-Compiler verwenden, der das nicht unterstützt _Bool und Sie haben Ihre eigenen definiert bool Typ, verhält es sich nicht wie C99 _Bool.
Elliot Frisch
Das Größte, was ich sehen kann, ist, dass es den Wert erzwingen (oder normalisieren) wird 1 oder 0 (das ist ein boolescher Wert) unabhängig davon, wie die x oder var Ausdruck erweitert (zB char oder double oder int oder usw.).
Es wird in einen booleschen Wert umgewandelt, was manchmal nützlich sein kann.
Siehe auch dies, dies, dies und viele mehr …
– devnull
4. Januar 2014 um 15:47 Uhr
Oh Mann, tut mir leid!
– Eine Person
5. Januar 2014 um 0:29 Uhr
@Siidheesh es hängt davon ab, wie Sie suchen, meine anfänglichen Suchen haben sie auch nicht aufgedeckt, aber leichte Änderungen später. Ich persönlich finde keinen der Dups, der den Nagel auf den Kopf getroffen hat, so wie der Kernel-Newbies-Thread, den ich gefunden habe, für dieses Nugget, das es wahrscheinlich wert war. Auch Keiths Erklärung ist auch eine weitaus bessere Erklärung als die meisten anderen in den Dups, aber er schreibt normalerweise im Allgemeinen großartige Antworten.
– Shafik Yaghmour
5. Januar 2014 um 1:39 Uhr
Ja, die Suche nach doppelter Verneinung hat funktioniert
– Eine Person
5. Januar 2014 um 2:10 Uhr