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 FALSCHFehlercode. 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.
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 🙂
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
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
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.
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