Warum !!(Bedingung) statt (Bedingung) verwenden? [duplicate]

Lesezeit: 3 Minuten

Der Benutzeravatar einer Person
Eine Person

Ich habe Code gesehen, in dem Leute Bedingungssätze mit zwei ‘!’s verwendet haben

#define check_bit(var, pos)       (!!((var) & (1 << (pos))))
#define likely(x)       __builtin_expect(!!(x),1)
#define unlikely(x)     __builtin_expect(!!(x),0)

sind einige der Beispiele, die ich finden konnte.

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

Benutzeravatar von Shafik Yaghmour
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):

Die Signatur von __builtin_expect

http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) ist:

long __builtin_expect (langes exp, langes c)

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 C99 bool Makro erweitert zu _Bool, true erweitert sich zu 1 und false erweitert sich zu 0. Die Einzelheiten sind im Normentwurfsteil aufgeführt 7.16 Boolescher Typ und Werte .

Die logische Negation wird abgedeckt 6.5.3.3 Unä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).

Benutzeravatar von Keith Thompson
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.

Benutzeravatar von Elliott Frisch
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.

1386900cookie-checkWarum !!(Bedingung) statt (Bedingung) verwenden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy