Diese Frage mag dumm klingen, aber warum werden die meisten Programmiersprachen mit einem Wert von 0 (null) und einem anderen Wert (ganzzahlig) 0bewertet ?falsetrue
String-Vergleich
Da die Frage ein bisschen zu einfach erscheint, möchte ich mich ein bisschen näher erläutern: Zunächst mag es jedem Programmierer klar erscheinen, aber warum sollte es keine Programmiersprache geben - es mag tatsächlich eine geben, aber keine Ich habe verwendet - wo wird 0ausgewertet trueund alle anderen [Ganzzahl] -Werte auf false? Diese eine Bemerkung mag zufällig erscheinen, aber ich habe ein paar Beispiele, bei denen es eine gute Idee gewesen sein könnte. Nehmen wir zunächst das Beispiel eines Strings-Drei-Wege-Vergleichs. Ich nehme C strcmpals Beispiel: Jeder Programmierer, der C als Muttersprache verwendet, könnte versucht sein, den folgenden Code zu schreiben:
if (strcmp(str1, str2)) { // Do something... }
Da strcmpgibt, 0was auswertet, falsewenn die Zeichenfolgen gleich sind, schlägt das, was der anfängliche Programmierer versucht hat, kläglich fehl und er versteht im Allgemeinen zunächst nicht, warum. Hätte stattdessen 0ausgewertet, truehätte diese Funktion in ihrem einfachsten Ausdruck verwendet werden können - dem obigen -, wenn sie auf Gleichheit verglichen worden wäre, und die richtigen Überprüfungen für -1und 1wären nur bei Bedarf durchgeführt worden. Wir hätten den Rückgabetyp die boolmeiste Zeit als (meiner Meinung nach) betrachtet.
Außerdem wollen wir einen neuen Typ einführen sign, der nur Werte annimmt -1, 0und 1. Das kann ziemlich praktisch sein. Stellen Sie sich vor, es gibt einen Raumschiff-Operator in C ++ und wir wollen ihn für std::string(nun, es gibt bereits die compareFunktion, aber der Raumschiff-Operator macht mehr Spaß). Die Erklärung wäre derzeit die folgende:
sign operator<=>(const std::string& lhs, const std::string& rhs);
Wäre 0bewertet worden true, dass es den Raumschiff-Operator nicht einmal geben würde, und wir hätten das so erklären operator==können:
sign operator==(const std::string& lhs, const std::string& rhs);
Dies operator==hätte den Drei-Wege-Vergleich sofort erledigt und könnte weiterhin verwendet werden, um die folgende Prüfung durchzuführen, während weiterhin geprüft werden kann, welche Zeichenfolge der anderen bei Bedarf lexikografisch überlegen ist:
if (str1 == str2) { // Do something... }
Alte Fehlerbehandlung
Wir haben jetzt Ausnahmen, so dass dieser Teil nur für die alten Sprachen gilt, in denen so etwas nicht existiert (zum Beispiel C). Wenn wir uns die Standardbibliothek von C (und auch die von POSIX) ansehen, können wir mit Sicherheit feststellen, dass maaaaany-Funktionen 0bei Erfolg und jede andere Ganzzahl zurückkehren. Ich habe leider einige Leute gesehen, die solche Dinge getan haben:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
Wenn wir darüber nachdenken, wie wir in der Programmierung denken, haben wir oft das folgende Argumentationsmuster:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
Wenn wir noch einmal darüber nachdenken, hätte es Sinn gemacht, den einzigen neutralen Wert, 0to yes(und so funktionieren die Funktionen von C) zu setzen, während alle anderen Werte vorhanden sein können, um die vielen Fälle von zu lösen no. Ich weiß jedoch, in allen Programmiersprachen (außer vielleicht einige experimentelle esotherische Sprachen), die yesausgewertet falsein einem ifZustand, während alle noFälle auswerten zu true. Es gibt viele Situationen, in denen "es funktioniert" einen Fall darstellt, während "es funktioniert nicht" viele wahrscheinliche Ursachen darstellt. Wenn wir so darüber nachdenken , wäre es viel sinnvoller gewesen, den Rest zu 0bewerten .truefalse
Fazit
Mein Fazit ist im Wesentlichen meine ursprüngliche Frage: Warum haben wir Sprachen entworfen, wo 0ist falseund die anderen Werte sind true, unter Berücksichtigung meiner wenigen obigen Beispiele und vielleicht einiger weiterer, an die ich nicht gedacht habe?
Follow-up: Es ist schön zu sehen, dass es viele Antworten mit vielen Ideen und möglichst vielen Gründen dafür gibt. Ich finde es toll, wie leidenschaftlich du darüber zu sein scheinst. Ich habe diese Frage ursprünglich aus Langeweile gestellt, aber da Sie so leidenschaftlich zu sein scheinen, habe ich beschlossen, ein wenig weiter zu gehen und nach den Gründen für die boolesche Wahl für 0 und 1 in Math.SE zu fragen :)
if true ; then ... ; fi, bei der truees sich um einen Befehl handelt, der Null zurückgibt und der ifzur Ausführung auffordert ....
boolTyp , aber Vergleiche / if Bedingungen usw. können einen beliebigen Rückgabewert haben.
strcmp()ist kein gutes Beispiel für wahr oder falsch, da es 3 verschiedene Werte zurückgibt. Und Sie werden überrascht sein, wenn Sie eine Shell verwenden, bei der 0 für wahr und alles andere für falsch steht.