In C und einigen ähnlichen Sprachen, zu vergleichen Booleschen Ausdrücken auf Gleichheit falseoder trueist eine gefährliche Gewohnheit.
In C kann jeder skalare Ausdruck (numerisch oder Zeiger) in einem booleschen Kontext verwendet werden, beispielsweise als Bedingung einer ifAnweisung. Die C-Regel ist if (cond)äquivalent zu if (cond != 0)- dh Null ist falsch und jeder Wert ungleich Null ist wahr. Wenn condes vom Zeigertyp ist, 0wird 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 condes 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 intWert zurück, 0wenn das Argument eine Ziffer ist, und nicht Null, wenn dies nicht der Fall ist. Es kann zurückkehren, 42um anzuzeigen, dass die Bedingung erfüllt ist. Der Vergleich 42 == truewird fehlschlagen.
Es kommt vor, dass dies 0der einzige Wert ist, der als falsch eingestuft falsewird. if (!cond)und if (cond == false)mache dasselbe. Aber wenn Sie das ausnutzen wollen, müssen Sie sich daran erinnern, dass Vergleichen mit falsein Ordnung ist und Vergleichen mit truenicht. Schlimmer noch, der Vergleich mit truewird die meiste Zeit funktionieren (zum Beispiel ergeben die Gleichheits- und Vergleichsoperatoren immer entweder 0oder 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 boolTyp etwas enger in die Sprache integriert und if (cond)wird condin Typ konvertiert bool. Aber der Effekt ist (meistens) der gleiche.
Einige andere Sprachen haben so etwas wie besser benommene Boolesche Sprachen, dass cond == trueund cond == false(oder wie auch immer die Syntax lautet) sicher sind. Trotzdem hat jede Sprache, die ich gesehen habe, einen Operator notoder !. es ist da, also kannst du es genauso gut benutzen. Verwenden cond == falsestatt !condoder not condnicht, 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 trueund falseist 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.