Ein Kommentar zu dieser Frage: Prüfen, ob eine Methode false zurückgibt: Ergebnis temporärer Variable zuweisen oder Methodenaufruf direkt in Bedingung setzen? sagt , dass Sie verwenden sollten , !boolean
statt boolean == false
bei der Prüfung Bedingungen. Warum? Für mich boolean == false
ist Englisch viel natürlicher und expliziter. Ich entschuldige mich, wenn dies nur eine Frage des Stils ist, aber ich habe mich gefragt, ob es einen anderen Grund für diese Präferenz von !boolean
?
59
boolean == true
: Es ergibt keinen Sinn. Ausdrücke inif
Anweisungen sind genau das: Ausdrücke. Wenn etwas bereits zu einem booleschen Ausdruck ausgewertet wird, warum sollten Sie ein Häkchen hinzufügen, um es dazu zu zwingen, dies zu bewerten?!boolean_variable
es die meisten C-Programmierer tun, stimme ich zu.boolean != true
?Antworten:
Wenn ich eine Zeile sehen wie
if (!lateForMeeting())
, las ich , dass wie „Wenn nicht zu spät für ein Treffen“ , die ziemlich geradlinig ist , zu verstehen, im Gegensatz zu ,if (lateForMeeting() == false)
die ich gelesen habe , wie „Wenn die Tatsache , dass ich zu spät zum Treffen bin falsch ist " .Ihre Bedeutung ist identisch, aber erstere entspricht eher der Konstruktion des entsprechenden englischen Satzes.
quelle
if not late_for_meeting
:)unless late_for_meeting
done()
. Doppelte Negative sind schlecht.Schreiben
== false
und== true
ist überflüssig. Es kann auch zu willkürlichen Extremen geführt werden. Wenn Sie anfangen zu schreibenWarum dann nicht?
Oder warum nicht?
Die Moral dieser Geschichte lautet: Wenn
condition
es sich um einen booleschen Ausdruck handelt, brauchen Sie nichts hinzuzufügen== false
. dafür ist der operator da!
;)quelle
== false
ist NICHT redundant, nur ausführlicher als!
. OTOH== true
ist überflüssig.(exp1 != exp2)
vs((exp1 == exp2) == false)
. Zugegeben, dies sind erfundene Szenarien, aber Sie sollten dennoch fast nie explizite Vergleiche mit wahr oder falsch anstellen. So wie Sie operator verwenden sollten!=
, sollten Sie auch operator verwenden!
.!
.bool_expression == bool_literal
,== ...
ist das überflüssig. Ob Sie auf Richtig oder Falsch prüfen, ist unerheblich. Es ist nur eine Änderung in der Reihenfolge der nachfolgenden / alternativen Blöcke. Andres Beispiele veranschaulichen diesen Punkt perfekt. Die meisten modernen Compiler optimieren die Redundanz, aber sie ist immer noch redundant.In C und einigen ähnlichen Sprachen, zu vergleichen Booleschen Ausdrücken auf Gleichheit
false
odertrue
ist eine gefährliche Gewohnheit.In C kann jeder skalare Ausdruck (numerisch oder Zeiger) in einem booleschen Kontext verwendet werden, beispielsweise als Bedingung einer
if
Anweisung. Die C-Regel istif (cond)
äquivalent zuif (cond != 0)
- dh Null ist falsch und jeder Wert ungleich Null ist wahr. Wenncond
es vom Zeigertyp ist,0
wird es als Nullzeiger-Konstante behandelt.if (ptr)
bedeutetif (ptr != NULL)
.Das bedeutet, dass
und
meine nicht dasselbe . Das erste ist wahr, wenn
cond
es nicht Null ist; die zweite ist nur dann wahr, wenn sie gleich isttrue
, was in C (wenn Sie haben#include <stdbool.h>
) einfach ist1
.Beispielsweise gibt die in
isdigit()
deklarierte Funktion<ctype.h>
einenint
Wert zurück,0
wenn das Argument eine Ziffer ist, und nicht Null, wenn dies nicht der Fall ist. Es kann zurückkehren,42
um anzuzeigen, dass die Bedingung erfüllt ist. Der Vergleich42 == true
wird fehlschlagen.Es kommt vor, dass dies
0
der einzige Wert ist, der als falsch eingestuftfalse
wird.if (!cond)
undif (cond == false)
mache dasselbe. Aber wenn Sie das ausnutzen wollen, müssen Sie sich daran erinnern, dass Vergleichen mitfalse
in Ordnung ist und Vergleichen mittrue
nicht. Schlimmer noch, der Vergleich mittrue
wird die meiste Zeit funktionieren (zum Beispiel ergeben die Gleichheits- und Vergleichsoperatoren immer entweder0
oder1
). Dies bedeutet, dass es schwierig sein kann, alle Fehler aufzuspüren, die Sie hiermit einführen. (Keine Sorge, sie werden angezeigt, sobald Sie einem wichtigen Kunden den Code vorführen.)C ++ hat etwas andere Regeln; Beispielsweise ist sein
bool
Typ etwas enger in die Sprache integriert undif (cond)
wirdcond
in Typ konvertiertbool
. Aber der Effekt ist (meistens) der gleiche.Einige andere Sprachen haben so etwas wie besser benommene Boolesche Sprachen, dass
cond == true
undcond == false
(oder wie auch immer die Syntax lautet) sicher sind. Trotzdem hat jede Sprache, die ich gesehen habe, einen Operatornot
oder!
. es ist da, also kannst du es genauso gut benutzen. Verwendencond == false
statt!cond
odernot cond
nicht, meiner Meinung nach , zur Verbesserung der Lesbarkeit. (Es ist wahr, dass die!
Figur auf einen Blick schwer zu erkennen ist. Manchmal füge ich nach dem ein Leerzeichen hinzu!
, um dies zu vermeiden.)Und oft können Sie das Problem vermeiden und die Übersichtlichkeit verbessern, indem Sie den Code leicht neu anordnen. Zum Beispiel anstatt:
du könntest schreiben:
Das ist nicht immer besser, aber es tut nicht weh, nach Möglichkeiten zu suchen, wo es ist.
Zusammenfassung: In C und C ++, Gleichheit Vergleichen
true
undfalse
ist gefährlich, allzu ausführlich, und schlechter Stil. In vielen anderen Sprachen sind solche Vergleiche vielleicht nicht gefährlich, aber sie sind immer noch zu ausführlich und von schlechtem Stil.quelle
== true
das unsicher ist. Fühlt sich so besser an.(==True) . f
klarstellen, dass wir wollen die-> Bool
instanziierung der return-polymorphen funktionf
. Das ist klarer alsnot . not . f
und weniger umständlich als(f :: a -> Bool)
.pred(x)==pred(y)
Dinge zu tun, wie zum Beispiel eine Bool-Return-Funktionpred
. Die Alternative,pred(x)? pred(y) : !pred(y)
der Sie zustimmen werden, ist kaum akzeptabel.pred(x)
undpred(y)
denselben Wert verwenden, um die Wahrheit zu bezeichnen, was in einigen Sprachen eine sichere Annahme ist, in anderen jedoch nicht. In C könnten Sie beispielsweise schreiben!!pred(x) == !!pred(y)
.Wenn
condition == false
es für Sie in der Tat "viel natürlicher in Englisch" ist, dann muss ich davon ausgehen, dass Sie kein Muttersprachler sind. Ansonsten kann ich das nicht erklären, weil niemand so spricht:Vergleichen Sie das mit
Trotzdem stimme ich zu, dass das einzelne, schlanke
!
Zeichen im Code leicht übersehen wird. Aus diesem Grund bevorzuge ich das Schlüsselwort,not
wenn es von der Sprache unterstützt wird. C ++ zum Beispiel tut dies erlauben , obwohl viele Programmierer davon nicht bewusst sind.Für Sprachen, die es erfordern
!
, setze ich ein Leerzeichen zwischen Operator und Operand. Dies macht die Verneinung viel schwerer zu übersehen:Beachten Sie, dass jeder Programmierer dies automatisch und ohne Bedenken so übersetzen sollte , dass es nicht im Kopf vorkommt. Das Erlernen dieser fließenden Kenntnisse beim Lesen von Code-Idiomen ist einer der ersten Schritte, um ein guter Programmierer zu werden.
quelle
Die beiden sind funktional identisch, so dass es Geschmackssache ist, welche man verwendet.
Der Hauptgrund, den ich benutze,
== false
ist, dass ich festgestellt habe, dass dies!
beim Betrachten von Code zu leicht zu übersehen ist.Ich habe es mir zur Gewohnheit gemacht, dies beim Testen auf Falsch sehr deutlich zu machen.
Wäre der Operator
not
wie in Pascal benannt worden, wäre dies meines Erachtens kein Problem geworden.quelle
== false
anstelle!
desselben vorgeschrieben war (um ihn hervorzuheben). Es war jedoch nicht erforderlich== true
, einen anderen Wert als Null zu verwenden.!
wahrscheinlich lästigste Fehler dieser Art ist, sollte dies IMO nicht dazu führen, dass man sich angewöhnt, zu schreiben,==false
sondern bessere Komponententests zu schreiben.Wenn ich sehe,
var == false
frage ich mich immer, obvar
es sich um einen Booleschen Wert oder einen Logiktyp mit mehr als zwei Werten handelt (z. B. mit einemmaybe
und einemundefined
sowietrue
undfalse
oder so etwas wie den neun Werten von IEEE 1164 ).quelle
weil manchmal Sie schreiben könnten
boolean = false
(mit den offensichtlichen Fehlern) undfalse == boolean
nicht natürlich scheinen (egal wie gut eine Praxis ist)quelle
if( INVALID_HANDLE_VALUE == hFile )
, solche Dinge zu vermeiden. Auf diese Weise erhalten Sie einen Compilerfehler, wenn Sie ein Gleichheitszeichen anstelle von zwei verwenden. Das funktioniert natürlich nur, wenn der linke Ausdruck eine Konstante ist, aber es hat mir mehr Kopfschmerzen erspart, als ich zählen kann.hFile==INVALID_HANDLE_VALUE
.if (!boolean_variable)
übersetzt zuif the condition is not true
.if (boolean == false)
übersetzt zuif the condition not false is true
. Da dies umgekehrte Logik ist, ist es schwieriger zu verstehen.quelle
isVisible
wäre ein besseres Beispiel. Dannif (!isVisible)
würde bedeuten, wenn nicht sichtbar - was dann einfacher zu verstehen istif (isVisible==false)
, was eine inverse Logik ist. Hoffe es ist jetzt klarer. Oder habe ich Ihren Kommentar falsch verstanden?In (viel) älteren Compilern, glaube ich, würden sie (boolean == false) in 2 Registerzuweisungen und einen Vergleichscode in Maschinensprache aufteilen. Das erste Beispiel würde in eine Zuweisung und einen NOT-Operator aufgeteilt. In Bezug auf die Leistung würde die Vergleichsoperation abhängig von der Größe des zu vergleichenden Registers eine Anzahl von Taktzyklen in Anspruch nehmen, verglichen mit einer bitweisen Invertierung (1 Takt) und wäre langsamer auszuführen.
Davon abgesehen glaube ich, dass neuere Compiler dies abschaffen, daher sollte es auch in Ordnung sein, damit umzugehen.
quelle
Bei der Arbeit habe ich es oft mit Booleschen Werten zu tun, die null sein können. Daher codiere ich diesen Fall oft als
weil ich persönlich der Meinung bin, dass die Symmetrie das Lesen erleichtert. Vor allem, wenn auch andere Boolesche Werte getestet werden.
Es ist mir so oder so egal.
quelle
value == true
dann gibt es keinen Grund zu prüfen, dass es nicht null ist. Sollte dievalue == null
if-Anweisung niemals ausgelöst werden,if (value)
sollte dies ausreichen.if (value)
eine Ausnahme auslösen . Ich würde es begrüßen, wenn Leute, die abstimmen, einen Grund angeben.value == true
würde ausreichen , selbst wenn der Wert null wäre.Wenn Sie die wahre Bedingung testen, ist es sinnvoll, dies zu tun
if (condition)
, insbesondere, wenn Sie die Konvention anwenden, dass boolesche Variablen mit 'is' beginnen:if (isOpen)
ist völlig klar und die Verwendung!= false
wäre überflüssig.Für ein C / C ++ / Java / etc. Programmierer, die Bedeutung des '!' Der Operator ist vollständig assimiliert, bis zu dem Punkt, dass wir automatisch "nicht" im Kopf haben, wenn wir es sehen. So ist das Haben
if (!isOpen)
so klar wieif (_NOT_ isOpen)
für mich. Aber Sie sind nicht vertraut genug, in C / C ++ könnten Sie ein Makro mit erstellen#define _NOT_ !
. Aber glauben Sie mir, nach ein paar Jahren ist das völlig unnötig.Abgesehen davon ist es immer vorzuziehen, Boolesche Werte zu testen, ohne sie mit Literalen zu vergleichen. Zum Beispiel ist es gefährlich zu testen,
if (x == true)
weil ein boolescher Wert als wahr betrachtet wird, wenn er nicht null ist, und das Literal wahr nur einen bestimmten Wert hat, so dass x "wahr" (dh ungleich null) sein kann und der Vergleich dennoch als falsch ausgewertet wird (weil es wahr ist) enthält 2 und das wörtliche true ist beispielsweise 1.) Natürlich gilt das nicht für einen Vergleich mit false, aber wenn Sie es beim Testen auf true nicht verwenden, warum dann, wenn Sie es auf false testen?quelle
Die Größe ist wichtig ;)
In gemischten Ausdrücken ist es einfacher zu lesen:
Und speziell für Ruby ein Beispiel, bei dem es sich um einen großen Unterschied handelt:
nil ist nicht falsch, aber es ist auch nicht wahr.
quelle
Basierend auf meiner Erfahrung und den Antworten auf meine Frage, die Sie verlinkt haben.
Einige Leute bevorzugen es, if (Bedingung) zu verwenden, weil es kürzer zu schreiben ist. und für mich macht es tatsächlich Sinn, zum Beispiel (! isValidated ()) Ich las dies als nicht validiert. Aber für mich basiert alles auf persönlichen Vorlieben und es hängt von der logischen Struktur der isValidated () -Methode ab, ob sie entweder true oder false zurückgibt
quelle
Wenn Sie Ihre Variable richtig benannt haben,
!boolean
ist dies natürlicher. Es sprichtnot boolean
jeden an, der genug Programmierer ist, um Code mental zu lesen .quelle
Für einige Leute ist es umso besser, je eher eine Bedeutung ausgedrückt wird.
Für diejenigen, die ein "wenn! ..." haben, ist das schneller als ein "wenn ...", wenn sie den gesamten Zustand durchlesen müssen (was eigentlich ziemlich lang sein könnte, z. B. (thisThing = thatThing oder etwas = das andere) ODER ( thinga = thingb und thinga = thingd) usw.), nur um am Ende == false zu finden.
Das haben! (Ich bevorzuge eigentlich ein Nicht, wenn die Sprache es zulässt.) Ganz vorne wird das englische 'Nicht' für diese Bedingung eher angezeigt.
Dieses Problem führt auch zu Überlegungen zur Verwendung
until
in Sprachen, die es unterstützen, z. Wie andere sagen, ist der Ausdruck natürlicher Sprache das Ziel. Ich mag das obige Beispiel "Sonne scheint".quelle
Ein weiterer Grund ist, dass, wenn Sie in einer Codebasis arbeiten, die mehrere Sprachen verwendet, wenn es eine idiomatische Methode gibt, um etwas zu tun, das in allen Sprachen sicher ist, es eine ziemlich gute Idee ist, dies überall so zu tun, damit Sie eine gute Gewohnheit bilden und sind weniger wahrscheinlich zu stolpern.
Ich kann mich nicht von irgendwo , dass
if (!variable)
(oder Äquivalente, wieif not variable
je nach Sprache) nicht sicher ist, während zBif self.is_ready() == False: ...
nicht sicher in Python ist , wennself.is_ready()
RückkehrNone
, jetzt oder in der Zukunft, die eine völlig vernünftige Sache wäre , es zu tun zeigen an, dass es nicht fertig ist, daNone
es genauso falsch ist wieFalse
.quelle