In C und einigen ähnlichen Sprachen, zu vergleichen Booleschen Ausdrücken auf Gleichheit false
oder true
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 ist if (cond)
äquivalent zu if (cond != 0)
- dh Null ist falsch und jeder Wert ungleich Null ist wahr. Wenn cond
es vom Zeigertyp ist, 0
wird es als Nullzeiger-Konstante behandelt. if (ptr)
bedeutet if (ptr != NULL)
.
Das bedeutet, dass
if (cond)
und
if (cond == true)
meine nicht dasselbe . Das erste ist wahr, wenn cond
es nicht Null ist; die zweite ist nur dann wahr, wenn sie gleich ist true
, was in C (wenn Sie haben #include <stdbool.h>
) einfach ist 1
.
Beispielsweise gibt die in isdigit()
deklarierte Funktion <ctype.h>
einen int
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 Vergleich 42 == true
wird fehlschlagen.
Es kommt vor, dass dies 0
der einzige Wert ist, der als falsch eingestuft false
wird. if (!cond)
und if (cond == false)
mache dasselbe. Aber wenn Sie das ausnutzen wollen, müssen Sie sich daran erinnern, dass Vergleichen mit false
in Ordnung ist und Vergleichen mit true
nicht. Schlimmer noch, der Vergleich mit true
wird die meiste Zeit funktionieren (zum Beispiel ergeben die Gleichheits- und Vergleichsoperatoren immer entweder 0
oder 1
). 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 und if (cond)
wird cond
in Typ konvertiert bool
. Aber der Effekt ist (meistens) der gleiche.
Einige andere Sprachen haben so etwas wie besser benommene Boolesche Sprachen, dass cond == true
und cond == false
(oder wie auch immer die Syntax lautet) sicher sind. Trotzdem hat jede Sprache, die ich gesehen habe, einen Operator not
oder !
. es ist da, also kannst du es genauso gut benutzen. Verwenden cond == false
statt !cond
oder not 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:
if (!cond) {
do_this();
}
else {
do_that();
}
du könntest schreiben:
if (cond) {
do_that();
}
else {
do_this();
}
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
und false
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.