Ist es in einer C-API üblich, dass 0 „wahr“ und 1 „falsch“ bedeutet?

Lesezeit: 6 Minuten

Bens Benutzeravatar
Ben

Ich bin auf ein gestoßen is_equals() Funktion in einer C-API bei der Arbeit, die 1 für ungleiche SQL-Tabellen (falsch) und 0 für gleiche (wahr) zurückgab. Mir wurde es erst klar, nachdem ich Testfälle für meinen Code ausgeführt hatte, einen für das positive und einen für das negative Beispiel, und beide schlugen fehl, was zunächst wenig Sinn ergab. Der Code in der API weist keinen Fehler auf, da die Ausgabe korrekt in der Dokumentation aufgezeichnet wurde.

Meine Fragen: Gibt es verkehrte Welten/Paralleluniversen/Codierungssprachen, in denen dieses logische NOTing normal ist? Ist 1 normalerweise nicht wahr? Macht der Programmierer der API einen Fehler?

  • Ich verstehe deine Frage nicht wirklich..

    – Benutzer541686

    25. Juni 2011 um 1:28

  • Manchmal zeigt 0 einen 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

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

    – Gima

    7. April 2014 um 9:08

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

    – NoelC

    31. August 2015 um 14:39 Uhr

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

    – dud3

    19. Okt. 2016 um 12:42

Es kommt häufig vor, dass Vergleichsfunktionen zurückkehren 0 auf „gleich“, so dass 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 funktionieren.

Es ist jedoch idiomatisch, dass Null falsch und ungleich Null wahr ist, da die C-Flusskontrolle und die logischen booleschen Operatoren auf diese Weise funktionieren. Es kann also sein, dass die für diese Funktion gewählten Rückgabewerte in Ordnung sind, aber es sind die Werte der Funktion Name das ist ein Fehler (es sollte eigentlich einfach aufgerufen werden compare() o.ä).

  • Interessant. Damit dies der Fall wäre, gäbe es zwei Inkonsistenzen. 1) Die Funktion is_equals() sollte eigentlich Compare() heißen. 2) Die Funktion müsste eine negative Zahl zurückgeben. Derzeit werden nur 0 und 1 zurückgegeben. Möglicherweise war dies bei einer früheren Revision der Fall. Dann ist die Frage, ob 1 und 2 wahrscheinlicher sind, als dass der Programmierer die „C-Flusskontrolle“ dumm durcheinander bringt. Vielleicht ersteres, da die übrigen Funktionen in der API üblicherweise 1 für „wahr“ und 0 für „falsch“ zurückgeben.

    – Ben

    25. Juni 2011 um 4:27

  • Viele int-typisierte C-Funktionen geben 0 zurück, wenn es sich um ein erfolgreiches Ergebnis handelt, aber das sollte nicht als Fehler angesehen werden FALSCH Ergebnis, sondern vielmehr FALSCH Fehlercode. Dahinter steckt eine Logik. Es ist in sich konsistenter, als es den Anschein hat. Allerdings weiß ich nicht, ob es das beabsichtigte mentale Modell ist, es als „Fehler ist falsch“ zu betrachten, oder wie ich es nur interpretiere …

    – Chris L

    19. September 2013 um 13:54


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

    – Martien de Jong

    23. September 2020 um 12:35 Uhr

Diese verkehrte Welt kommt häufig bei Rückgaben von Prozessfehlern vor. Die Shell-Variable $? meldet den Rückgabewert des vorherigen Programms, das von der Shell ausgeführt werden soll, sodass leicht festgestellt werden kann, 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 kann, warum ein Programm fehlschlägt – indem ein Programm viele verschiedene Fehlercodes zulässt, kann es feststellen Warum Ein anderes Programm ist fehlgeschlagen, ohne dass die Ausgabe analysiert werden musste.

Ein konkretes Beispiel ist das aa-status Programm, das mit dem geliefert wird 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 sicher, dass es weiter verbreitete Programme mit diesem Verhalten gibt, aber dieses kenne ich gut. 🙂

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

    – Josh Lee

    25. Juni 2011 um 1:35

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

    – Ben

    25. Juni 2011 um 1:38

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

    – aushämmern

    5. Dezember 2017 um 7:52 Uhr

  • @unhammer, hehe, das ist großartig! Danke

    – Sarnold

    6. Dezember 2017 um 4:31

Benutzer-Avatar von Peter K
Peter K.

Ich vermute, dass es nur dem Linux/Unix-Standard folgt Bei Erfolg wird 0 zurückgegeben.

Macht es Wirklich Sagen Sie, „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 soll man es sagen if(!IsWhatever()){}?

    – GSerg

    25. Juni 2011 um 1:33

  • Zur Verdeutlichung: Es heißt, dass bei Gleichheit 0 und bei Ungleichheit 1 zurückgegeben wird. Da es sich um eine is_equals-Funktion handelt, habe ich die beiden als synonym angesehen.

    – Ben

    25. Juni 2011 um 1:34

Es gibt keinen guten Grund dafür 1 um wahr zu sein und 0 falsch sein; So wurden die Dinge einfach 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, die Sie verwenden, ohne einen verdammt guten Grund, dies zu tun, können Sie nicht ändern. Wer auch immer diese Funktion geschrieben hat, war also wahrscheinlich ziemlich dämlich, wenn man davon ausgeht, dass es sich nicht einfach um einen Fehler handelt.

Es kann sich durchaus um einen Fehler des ursprünglichen Autors handeln, allerdings ist die Vorstellung, dass 1 wahr und 0 falsch ist, kein universelles Konzept. Beim Shell-Scripting wird 0 für Erfolg und jede andere Zahl für Fehler zurückgegeben. In anderen Sprachen wie Ruby gelten nur Null und Falsch als falsch und jeder andere Wert gilt als wahr, 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 für eine Sprache, die boolesche Typen unterstützt, nur logisch, gültige Ausdrücke als wahr auszuwerten, daher ist 0 gleich wahr (0 ist ein gültiger ganzzahliger Wert).

    – Spidey

    30. April 2012 um 19:59 Uhr

Benutzeravatar von Abdul Basit Rishi
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 für eine Sprache, die boolesche Typen unterstützt, nur logisch, gültige Ausdrücke als wahr auszuwerten, daher ist 0 gleich wahr (0 ist ein gültiger ganzzahliger Wert).

    – Spidey

    30. April 2012 um 19:59 Uhr

Benutzeravatar von user541686
Benutzer541686

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

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

1454230cookie-checkIst es in einer C-API üblich, dass 0 „wahr“ und 1 „falsch“ bedeutet?

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

Privacy policy