Warum / Wann (!! p) anstelle von (p! = NULL) zu verwenden ist

7

Was ist im folgenden Code der Nutzen von (!!p) anstelle von (p != NULL) ?

%Vor%     
Juan Macek 22.10.2009, 08:10
quelle

8 Antworten

9

Das ist eine Frage des Stils, tatsächlich sind sie gleichwertig. Siehe diese sehr ähnliche Frage zur Diskussion.

IMO Vergleich gegen Nullzeiger ist klarer.

    
sharptooth 22.10.2009, 08:12
quelle
11

Es ist ziemlich genau dasselbe, obwohl ich den !!p für einen schlechten Stil halte und normalerweise auf einen Programmierer hindeutet, der versucht, clever zu sein.

    
Wernsey 22.10.2009 08:14
quelle
7

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 ++.

    
Konrad Rudolph 22.10.2009 09:48
quelle
3

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.

    
Twisol 22.10.2009 08:14
quelle
0

Siehe und das .

    
Anton Gogolev 22.10.2009 08:14
quelle
0

Sie sind die gleichen, aber ich empfehle,

zu verwenden %Vor%

Es ist besser lesbar.

    
Cătălin Pitiș 22.10.2009 08:14
quelle
-1

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 .

    
Matt Joiner 22.10.2009 09:26
quelle
-2

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.

    
Pasi Savolainen 22.10.2009 08:15
quelle

Tags und Links