Diese Frage mag dumm klingen, aber warum werden die meisten Programmiersprachen mit einem Wert von 0 (null) und einem anderen Wert (ganzzahlig) 0
bewertet ?false
true
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 0
ausgewertet true
und 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 strcmp
als Beispiel: Jeder Programmierer, der C als Muttersprache verwendet, könnte versucht sein, den folgenden Code zu schreiben:
if (strcmp(str1, str2)) { // Do something... }
Da strcmp
gibt, 0
was auswertet, false
wenn 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 0
ausgewertet, true
hä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 -1
und 1
wären nur bei Bedarf durchgeführt worden. Wir hätten den Rückgabetyp die bool
meiste Zeit als (meiner Meinung nach) betrachtet.
Außerdem wollen wir einen neuen Typ einführen sign
, der nur Werte annimmt -1
, 0
und 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 compare
Funktion, 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 0
bewertet 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 0
bei 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, 0
to 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 yes
ausgewertet false
in einem if
Zustand, während alle no
Fä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 0
bewerten .true
false
Fazit
Mein Fazit ist im Wesentlichen meine ursprüngliche Frage: Warum haben wir Sprachen entworfen, wo 0
ist false
und 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 true
es sich um einen Befehl handelt, der Null zurückgibt und der if
zur Ausführung auffordert ...
.
bool
Typ , 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.