1 = falsch und 0 = wahr?

Lesezeit: 6 Minuten

Benutzer-Avatar
Ben

Ich bin bei der Arbeit auf eine is_equals () -Funktion in der ac-API gestoßen, die 1 für nicht gleiche SQL-Tabellen (false) und 0 für gleiche (true) zurückgegeben hat. Ich habe es erst bemerkt, nachdem ich Testfälle für meinen Code ausgeführt hatte, einen für das positive Beispiel und einen für das negative, und beide schlugen fehl, was zunächst wenig Sinn machte. Der Code in der API hat keinen Fehler, da die Ausgabe korrekt in seiner Dokumentation aufgezeichnet wurde.

Meine Fragen – gibt es auf dem Kopf stehende Welten / Paralleluniversen / Programmiersprachen, in denen dieses logische NOTieren normal ist? Ist 1 normalerweise nicht wahr? Macht der Programmierer der API einen Fehler?

  • ich versteh deine frage nicht ganz..

    – Benutzer541686

    25. Juni 2011 um 1:28 Uhr

  • Manchmal zeigt 0 Erfolg an und andere Zahlen geben Fehlercodes an. Aber ich verstehe, warum das verwirrend ist, da die Funktion wahr/falsch zurückgibt.

    – Marlon

    25. Juni 2011 um 1:56 Uhr

  • 0 = falsch, 1 = wahr und alles andere = wahr (Für alle, die eine schnelle Antwort auf die Frage in der Titel). Quelle: § 4.12

    – Gima

    7. April 2014 um 9:08 Uhr

  • Schauen Sie nur bis zu so etwas wie strcmp (String Compare) in der C-Standardbibliothek, um ein Beispiel zu sehen, bei dem eine allgemeine Behauptung “1 = true” keinen Sinn ergibt.

    – NoelC

    31. August 2015 um 14:39 Uhr

  • > Macht der Programmierer der API einen Fehler? Nein.

    – dumm3

    19. Oktober 2016 um 12:42 Uhr

Es ist üblich, dass Vergleichsfunktionen zurückkehren 0 auf “gleich”, damit sie auch eine negative Zahl für “kleiner als” und eine positive Zahl für “größer als” zurückgeben können. strcmp() und memcmp() so arbeiten.

Es ist jedoch idiomatisch, dass null falsch und ungleich null wahr ist, denn so funktionieren die C-Flusskontrolle und die logischen booleschen Operatoren. Es kann also sein, dass die für diese Funktion gewählten Rückgabewerte in Ordnung sind, aber es sind die der Funktion Name das ist ein Fehler (es sollte wirklich nur aufgerufen werden compare() oder ähnliches).

  • Interessant. Damit dies der Fall wäre, gäbe es zwei Ungereimtheiten. 1) Die Funktion is_equals() sollte eigentlich Compare() heißen. 2) Die Funktion müsste eine negative Zahl zurückgeben. Derzeit gibt es nur 0 und 1 zurück. Vielleicht hat eine frühere Revision dies getan. Dann stellt sich die Frage, ob 1&2 wahrscheinlicher sind als der Programmierer, der die “C-Flusskontrolle” dumm vermasselt. Vielleicht ersteres, da der Rest der Funktionen in der API herkömmlicherweise 1 für wahr und 0 für falsch zurückgibt.

    – Ben

    25. Juni 2011 um 4:27 Uhr

  • Viele int-typisierte C-Funktionen geben 0 zurück, wenn es sich um ein erfolgreiches Ergebnis handelt, aber das sollte nicht als a angesehen werden FALSCH Ergebnis, sondern eher FALSCH Fehlercode. Das hat eine Logik. Es ist intern konsistenter, als es den Anschein haben mag. Ich weiß jedoch nicht, ob es das beabsichtigte mentale Modell ist, es als “Fehler ist falsch” zu sehen, oder nur, wie ich es interpretiere …

    – Chris L

    19. September 2013 um 13:54 Uhr


  • Ich bin auf viele Varianten gestoßen, insbesondere im Pascal-Code. Dinge wie -1 falsch 0 wahr oder -1/1

    – Martin de Jong

    23. September 2020 um 12:35 Uhr

Diese auf dem Kopf stehende Welt ist bei Prozessfehlerrückgaben üblich. Die Shell-Variable $? meldet den Rückgabewert des vorherigen Programms, das von der Shell ausgeführt werden soll, sodass leicht zu erkennen ist, ob ein Programm erfolgreich ist oder fehlschlägt:

$ false ; echo $?
1
$ true ; echo $?
0

Dies wurde gewählt, weil es einen einzigen Fall gibt, in dem ein Programm erfolgreich ist, es aber Dutzende von Gründen geben könnte, warum ein Programm fehlschlägt – indem es zulässt, dass es viele verschiedene Fehlercodes gibt, kann ein Programm feststellen warum ein anderes Programm ist fehlgeschlagen, ohne dass die Ausgabe analysiert werden musste.

Ein konkretes Beispiel ist die aa-status mitgeliefertes Programm AppArmor obligatorische Zugangskontrolle Werkzeug:

   Upon exiting, aa-status will set its return value to the
   following values:

   0   if apparmor is enabled and policy is loaded.

   1   if apparmor is not enabled/loaded.

   2   if apparmor is enabled but no policy is loaded.

   3   if the apparmor control files aren't available under
       /sys/kernel/security/.

   4   if the user running the script doesn't have enough
       privileges to read the apparmor control files.

(Ich bin mir sicher, dass es weiter verbreitete Programme mit diesem Verhalten gibt, aber dieses hier kenne ich gut. 🙂

  • grep ist ein guter. „Normalerweise ist der Exit-Status 0, wenn ausgewählte Zeilen gefunden werden, andernfalls 1. Aber der Exit-Status ist 2, wenn ein Fehler aufgetreten ist.“

    – Josh Lee

    25. Juni 2011 um 1:35 Uhr

  • Danke, das macht Sinn. Ich wusste nicht, dass Fehlerstatus so funktionieren. Der Fall is_equals ist immer noch seltsam, weil er nicht mit irgendeiner Art von Fehlerprüfung verbunden ist.

    – Ben

    25. Juni 2011 um 1:38 Uhr

  • „Es gibt einen einzigen Fall, in dem ein Programm erfolgreich ist, aber es kann Dutzende von Gründen geben, warum ein Programm fehlschlägt“ – auch bekannt als die Anna-Karenina-Prinzip 🙂

    – Aushämmern

    5. Dezember 2017 um 7:52 Uhr

  • @unhammer, hehe, das ist toll! Vielen Dank

    – Sarnold

    6. Dezember 2017 um 4:31 Uhr

Benutzer-Avatar
Peter K.

Ich vermute, es folgt nur dem Linux / Unix-Standard Rückgabe von 0 bei Erfolg.

Macht es Ja wirklich sagen “1” ist falsch und “0” ist wahr?

  • Scheint so, aber das wäre eine ziemlich hirntote Anwendung des Standards. IsWhatever ist verpflichtet, 0 zurückzugeben, wenn dies nicht der Fall ist Issonst, wie willst du sagen if(!IsWhatever()){}?

    – GSerg

    25. Juni 2011 um 1:33 Uhr

  • Zur Verdeutlichung – es heißt, es wird 0 zurückgegeben, wenn es gleich ist, 1, wenn es nicht gleich ist. Da es sich um eine is_equals-Funktion handelt, habe ich die beiden als Synonyme genommen.

    – Ben

    25. Juni 2011 um 1:34 Uhr

Es gibt keinen guten Grund dafür 1 wahr sein und 0 falsch sein; so wurden die Dinge immer notiert. Aus logischer Sicht ist die Funktion in Ihrer API also nicht per se “falsch”.

Allerdings ist es normalerweise nicht ratsam zu arbeiten gegen die Redewendungen der Sprache oder des Frameworks, das Sie verwenden, ohne einen verdammt guten Grund, also war derjenige, der diese Funktion geschrieben hat, wahrscheinlich ziemlich dämlich, vorausgesetzt, es handelt sich nicht einfach um einen Fehler.

Es kann durchaus ein Fehler des ursprünglichen Autors sein, aber die Vorstellung, dass 1 wahr und 0 falsch ist, ist kein universelles Konzept. Beim Shell-Skripting wird 0 für Erfolg und jede andere Zahl für Fehler zurückgegeben. In anderen Sprachen wie Ruby werden nur nil und false als falsch angesehen, und jeder andere Wert wird als wahr angesehen, sodass in Ruby sowohl 1 als auch 0 als wahr gelten würden.

  • Erfolg und Misserfolg (Fehlercodes) sind ein ganz anderes Konzept als boolesche Werte. Außerdem ist es nur logisch, dass eine Sprache, die boolesche Typen unterstützt, gültige Ausdrücke als wahr auswertet, daher ist 0 gleich wahr (0 ist ein gültiger ganzzahliger Wert).

    – Spidy

    30. April 2012 um 19:59 Uhr

Benutzer-Avatar
Abdul Basit Rishi

Einfache Antwort

0 = false 
1 = true

  • Erfolg und Misserfolg (Fehlercodes) sind ein ganz anderes Konzept als boolesche Werte. Außerdem ist es nur logisch, dass eine Sprache, die boolesche Typen unterstützt, gültige Ausdrücke als wahr auswertet, daher ist 0 gleich wahr (0 ist ein gültiger ganzzahliger Wert).

    – Spidy

    30. April 2012 um 19:59 Uhr

Benutzer-Avatar
Benutzer541686

Ich bin mir nicht sicher, ob ich die Frage richtig beantworte, aber hier ist ein bekanntes Beispiel:

Der Rückgabetyp von GetLastError() in Windows ist ungleich Null, wenn ein Fehler aufgetreten ist, andernfalls Null. Das Gegenteil gilt normalerweise für den Rückgabewert der von Ihnen aufgerufenen Funktion.

1383860cookie-check1 = falsch und 0 = wahr?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy