Was ist im folgenden Code der Nutzen von (!!p)
anstelle von (p != NULL)
?
Das ist eine Frage des Stils, tatsächlich sind sie gleichwertig. Siehe diese sehr ähnliche Frage zur Diskussion.
IMO Vergleich gegen Nullzeiger ist klarer.
Ich ding GMans ursprünglichen Kommentar sollte die akzeptierte Antwort sein:
Ich frage mich, was ist los mit nur
if (p)
Der Punkt ist: nothing stimmt nicht damit, und dies sollte der bevorzugte Weg sein. Erstens ist !!p
"zu schlau"; es ist auch völlig unnötig und somit schlecht (beachte: wir sprechen hier über Zeiger in einer if
-Anweisung, so dass der Kommentar von Anacrolix, obwohl allgemein gültig, hier nicht zutrifft!).
Dasselbe gilt für p != NULL
. Während dies möglich ist, wird es einfach nicht benötigt. Es ist mehr Code, es ist komplett redundant Code und daher macht es den Code schlechter. Das wahrhaftigste, was Jeff Atwood je gesagt hat, war, dass "der beste Code überhaupt kein Code ist". Vermeiden Sie redundante Syntax. Bleiben Sie auf dem Minimum (das enthält immer noch die vollständige Bedeutung; if (p)
ist vollständig).
Schließlich ist if (p)
wohl die idiomatischste Art, dies in C ++ zu schreiben. C ++ krümmt sich rückwärts, um dasselbe Verhalten für andere Typen in der Sprache (z. B. Datenströme) zu erhalten, auf Kosten einiger sehr merkwürdiger Eigenarten. Die nächste Version des Standards führt sogar eine neue Syntax ein, um dieses Verhalten in benutzerdefinierten Typen zu erreichen.
Für Zeiger erhalten wir das gleiche kostenlos. Also benutze es.
/ EDIT: Über Klarheit: sharptooth schreibt das
IMO Vergleich gegen Nullzeiger ist klarer.
Ich behaupte, dass dies objektiv falsch ist: if (p)
ist klarer. Es gibt keinen möglichen Weg, dass diese Aussage irgendetwas anderes bedeuten könnte, weder in diesem Kontext noch in irgendeinem anderen, in C ++.
Soweit ich sehen kann, ist es nur eine kürzere Möglichkeit, es in einen booleschen Wert umzuwandeln. Es gilt das! zweimal, während p != NULL
einen Vergleich durchführt. Also ich denke, der Vorteil ist nur kürzer Code, wenn auch mehr kryptisch, wenn Sie nicht wissen, was !!p
bedeuten soll.
Sie sind die gleichen, aber ich empfehle,
zu verwenden %Vor%Es ist besser lesbar.
Es gibt keinen Unterschied in dem gegebenen Beispiel.
Die Annahme, dass dies für alle Fälle gilt, ist jedoch falsch. a = nicht nicht b ist nicht dasselbe wie a = b , was Integer-Typen betrifft.
In C ist 0
falsch. Alles außer 0
ist wahr. Aber not 0
ist 1
und sonst nichts. In C ++ wird " 1
" als Integer interpretiert, und zwar nicht nur für die Abwärtskompatibilität mit C, sondern auch, weil 1
nicht 0
ist und 1
der häufigste Wert ist, der in C bool-Typen für true verwendet wird. einschließlich des offiziellen C bool-Typs und BOOL
in Win32.
Während für den angegebenen Beispielcode !!p
unnötig ist, weil das Ergebnis für die Auswertung der Bedingung bool
in ein if
umgewandelt wird, schließt dies die Verwendung von !!
für Casting-Zwecke nicht aus Boolesche Werte für erwartete ganzzahlige Werte. Persönlich in diesem Beispiel, um die Wahrscheinlichkeit zu maximieren, dass Typänderungen und Semantiken klar sind, würde ich NULL != p
oder p != NULL
verwenden, um es absolut klar zu machen, was gemeint ist.
Diese Technik ist bekannt als das Double-Bang-Idiom, und dieser Typ bietet einige gute Rechtfertigungen .
Do !! NICHT doppelte Negation verwenden. Ein einfaches Argument ist, dass, da C ++ eine begrenzte englische Teilmenge ist und Englisch einfach keine doppelte Negation hat, Englischsprachige eine große Schwierigkeit haben, zu analysieren, was vor sich geht.