Einfache Frage wirklich; Gibt es einen Unterschied zwischen diesen Werten (und gibt es einen Unterschied zwischen BOOL und Bool)? Ein Mitarbeiter erwähnte, dass sie in Objective-C verschiedene Dinge bewerten, aber als ich mir die Typedefs in ihren jeweiligen .h-Dateien ansah, wurden YES / TRUE / true als 1
und NO / FALSE / false als definiert 0
. Gibt es wirklich einen Unterschied?
objective-c
boolean
Kevlar
quelle
quelle
Antworten:
Es gibt keinen praktischen Unterschied, vorausgesetzt, Sie verwenden
BOOL
Variablen als Boolesche Werte. C verarbeitet boolesche Ausdrücke basierend darauf, ob sie 0 ergeben oder nicht 0. Also:bedeutet das gleiche wie
Aus diesem Grund können Sie jeden primitiven Typ oder Ausdruck als booleschen Test auswerten (einschließlich z. B. Zeiger). Beachten Sie, dass Sie das erstere tun sollten, nicht das letztere.
Beachten Sie, dass es ist ein Unterschied , ob man stumpfe Werte zu einem sogenannten zuweisen
BOOL
Variable und Test für bestimmte Werte, so dass immer sie als booleans verwenden und ordnen sie nur von ihren#define
Werten.Wichtig ist, dass Sie Boolesche Werte niemals mit einem Zeichenvergleich testen - dies ist nicht nur riskant, da
someVar
ein Wert ungleich Null zugewiesen werden kann, der nicht JA ist, sondern meiner Meinung nach, was noch wichtiger ist, die Absicht nicht richtig ausdrückt:Mit anderen Worten, verwenden Sie Konstrukte so, wie sie verwendet und dokumentiert werden sollen, und Sie ersparen sich eine Welt voller Verletzungen in C.
quelle
Ich glaube, es gibt einen Unterschied zwischen
bool
undBOOL
. Auf dieser Webseite finden Sie eine Erklärung, warum:http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
Da
BOOL
es sichunsigned char
nicht um einen primitiven Typ handelt, können Variablen des TypsBOOL
andere Werte alsYES
und enthaltenNO
.Betrachten Sie diesen Code:
Die Ausgabe ist:
Für die meisten Menschen ist dies ein unnötiges Problem, aber wenn Sie wirklich einen Booleschen Wert wünschen, ist es besser, einen zu verwenden
bool
. Ich sollte hinzufügen: Das iOS SDK verwendetBOOL
im Allgemeinen für seine Schnittstellendefinitionen, so dass dies ein Argument ist, an dem man festhalten mussBOOL
.quelle
bool
, und daher ist es Tradition, einenint
oderchar
als Booleschen Wert zu verwenden, manchmal mit einem #define, um den Unterschied zu verbergen, und manchmal nicht. Tatsächlich bin ich mir nicht sicher, ob selbst aktuelle Standardsbool
so implementiert werden müssen, dass die interne Struktur nicht überprüft werden kann.printf
Lügen erzählt. Der Wert vonb
ist nichtYES
, es ist "nicht Null", was die Bedingung testet. Also solltest du habenprintf("b is not zero")
, was nicht unbedingt das gleiche ist wieYES
. In diesem Fallb
ist sowohl "nicht Null" als auch "nicht JA".Ich habe dies ausführlich getestet. Meine Ergebnisse sollten für sich selbst sprechen:
Die Ausgabe ist:
quelle
if
oder einem hatwhile
. Wie ...while("guitar gently weeps")
sollte nicht funktionieren ...if (user_id = ROOT_UID)
Vielleicht möchten Sie die Antworten auf diese Frage lesen . Zusammenfassend in Objective-C (aus der Definition in objc.h):
quelle
Der Hauptunterschied (gefährlich!) Zwischen
true
undYES
liegt in der JSON-Serialisierung.Zum Beispiel haben wir eine Serveranforderung vom Typ JSON und müssen true / false in json sence senden:
Dann konvertieren wir es in eine JSON-Zeichenfolge, bevor wir es als senden
Das Ergebnis ist
Aufgrund der API-Logik
jsonString1
kann dies zu einem Fehler führen.Seien Sie also vorsichtig mit Booleschen Werten in Objective-C.
Zusammenfassend lässt sich sagen, dass nur exakte
@YES
und gegossene Werte@((BOOL)expression)
vom__NSCFBoolean
Typ sind undtrue
mit JSON-Serialisierung konvertiert werden . Alle anderen Ausdrücke wie@(expression1 && expression2)
(gerade@(YES && YES)
) sind vom__NSCFNumber (int)
Typ und werden1
in JSON konvertiert .PS Sie können einfach einen Booleschen Wert mit Zeichenfolgen verwenden
quelle
Es gibt einen subtilen Fehler, den hier niemand erwähnt hat, von dem ich dachte, ich würde ihn einschließen ... eher ein logischer Fehler als irgendetwas:
Das Problem hier ist also genau das,
(YES==1)
und in C ist der Vergleich kein boolescher, sondern ein auf dem Wert basierender.weil
YES
es nur ein#define
(und nicht etwas, das der Sprache innewohnt) ist, muss es einen Wert haben und1
ist am sinnvollsten.quelle
Ich denke, sie fügen JA / NEIN hinzu, um in vielen Fällen selbsterklärender zu sein. Beispielsweise:
klingt besser als
quelle
Lassen Sie uns zunächst untersuchen, was wahr und falsch ist und was ihnen überhaupt Bedeutung gibt.
Wir können eine Struktur konstruieren, die aufgerufen wird, wenn a dann b sonst c in der Lambda-Rechnung wie folgt ist:
In JavaScript sieht dies folgendermaßen aus:
Damit ifThenElse nützlich ist, benötigen wir eine Funktion "true", die entweder rechts oder links wählt und dies unter Ignorieren der anderen Option tut, oder eine Funktion "false", die die Option "true" auswählt, nicht.
Wir können diese Funktionen wie folgt definieren:
In JavaScript sieht es so aus:
Jetzt können wir Folgendes tun
Mit doThis und doThat (\ a. ()), da Lambda Calculus keine Dienste wie Drucken / Mathematik / Zeichenfolgen anbietet, können wir nur nichts tun und sagen, dass wir es getan haben (und später betrügen, indem wir es durch Dienste in ersetzen unser System, das die gewünschten Nebenwirkungen bietet)
Lassen Sie uns dies in Aktion sehen.
Das ist eine tiefe Umgebung, die vereinfacht werden könnte, wenn wir Arrays / Maps / Argumente / oder mehr als eine Anweisung verwenden könnten, um sie in mehrere Funktionen aufzuteilen, aber ich möchte sie so rein wie möglich halten, um mich auf Funktionen mit genau einem Argument zu beschränken nur.
Beachten Sie, dass der Name Wahr / Falsch keine inhärente Bedeutung hat. Wir können sie leicht in Ja / Nein, Links / Rechts, Rechts / Links, Null / Eins, Apfel / Orange umbenennen. Es ist insofern von Bedeutung, als die getroffene Wahl nur durch die Art der Wahl verursacht wird, die sie getroffen hat. Wenn also "LINKS" gedruckt wird, wissen wir, dass die Auswahl nur wahr sein kann, und basierend auf diesem Wissen können wir unsere weiteren Entscheidungen leiten.
Also um es zusammenzufassen
quelle
Nein, JA / NEIN ist eine andere Art, sich auf WAHR / FALSCH (1/0) zu beziehen.
quelle