Wir hatten eine Aufgabe für unsere Klasse, bei der wir ein Tic-Tac-Toe- Spiel erstellen mussten . Die Leute machen sich gerne Komplikationen und schrieben komplexe Spiele mit Menüs. Am Ende des Spiels musste man die Option haben, erneut zu spielen oder das Programm zu beenden. Ich habe dafür eine int
Variable verwendet, aber ich habe festgestellt, dass einige Klassenkameraden BOOLs verwenden.
Ist es effizienter? Was ist der Unterschied zwischen dem Speichern einer Antwort, in der nur zwei Werte gespeichert werden sollen, int
und dem Speichern in einem Bool? Was ist der genaue Zweck dieser Variablen?
int
ist das Speichern einer Ganzzahl und der Zweck von abool
ist das Speichern eines Booleschen Wertes (true
oderfalse
). Die Verwendung einesbool
IMO spiegelt seine Verwendung viel besser wider als die Verwendung einesint
.typedef int Bool
einen Booleschen Wert, um deutlich zu machen, dass sie diesen verwendeten. C ++ integrierte Unterstützung fürbool
in die Sprache, ebenso wie C99 mit dem (ziemlich hässlichen)_Bool
Schlüsselwort.bool
", sondern darum, warum wir unterschiedliche Namen für ähnliche Typen (wielength_t
) haben und warum es wichtig ist, dass der Compiler Typen überprüft.Antworten:
Bei der Auswahl von Variablentypen und Variablennamen soll Ihre Absicht so klar wie möglich sein. Wenn Sie einen
bool
(booleschen) Typ auswählen , gibt es nur zwei zulässige Werte:true
oderfalse
. Wenn Sie einenint
(Ganzzahl-) Typ verwenden, ist nicht mehr klar, dass die Absicht dieser Variablen nur 1 oder 0 sein kann oder welche Werte Sie auch immer bedeuten möchtentrue
undfalse
. Plussizeof(int)
gibt normalerweise 4 Bytes zurück, währendsizeof(bool)
1 zurückgegeben wird.quelle
Es scheint in allen (bis jetzt) gesammelten Antworten niemand aufgefallen zu sein, dass das OP darüber
BOOL
nicht sprachbool
.Da die Frage mit C ++ markiert ist, muss Folgendes beachtet werden:
int
eine ganze Zahl , die von BereichINT_MIN
zuINT_MAX
- in definierten Makros ,<climits>
deren Werte sind abhängig von der Architektur des Hosting - Maschine. In C ++ diese Werte sind auch zugänglichstd::numeric_limits<int>::min()
und...:max()
jeweils). Das Verhalten von Booleschen Operatoren angewendetint
behandeln0
als falsch und alles andere als wahr .BOOL
ist nur ein Hinweis auf ein boolesches Verhalten für ein int. Es ist definiert in<cstddef>
alsBOOL
ist also nichts weiter als syntaktischer Zucker, für was - vom Compiler - ist es nichts weiter als ein Int. Es ist etwas, das C-Programmierer verwenden, aber C ++ - Programmierer sollten es vermeiden, da C ++ dies hatbool
.bool
ist ein Sprachintegraltyp mit den unterstützten Werten justtrue
undfalse
. Bei der Konvertierung inint
true
wird 1 undfalse
wird 0.Der wichtige Aspekt ist, dass es vor Programmierfehlern sicherer ist:
Es ist unmöglich, mit dem richtigen Bool-Typ zu codieren:
Verwenden
BOOL
stattbool
ist nur eine schlechte Angewohnheit, die von einer glorreichen Vergangenheit geerbt wurde, die niemand mehr vergessen kann, wodurch ein altes Problem für ein weniger glorreiches Morgen entsteht.Sprachlehrer sollten ernsthaft darüber nachdenken!
quelle
Bool-Typen sind kleiner als Int-Typen und belegen daher weniger Speicherplatz. Abhängig von dem System, für das Sie kompilieren, kann ein Int 4 - 8 Byte lang sein, während ein Bool 1 Byte lang ist (wie in diesem MSDN-Artikel zu sehen ist ).
Kombinieren Sie dies mit einigen Aspekten von KISS und gutem Programmdesign, und es wird offensichtlich, warum es besser ist, einen Bool zum Speichern einer Variablen zu verwenden, die immer nur zwei Werte hat.
Warum komplizieren Sie Dinge mit einem Objekt, das einen weiten Bereich von Werten speichern kann, wenn Sie sicher sind, dass Sie immer nur 1 von 2 verschiedenen Werten speichern müssen?
Was passiert in dem System, das ein int verwendet, wenn Sie dort 75 speichern? Wenn Sie zusätzliche Bedingungen hinzugefügt haben
oder
Dann sind Sie für diese Situation abgesichert. Aber wenn nicht, dann nicht.
Sie könnten auch einen Fall haben (abhängig davon, wie Sie den Wert des int ändern), in dem Sie einen Pufferüberlauf haben und der Wert auf 0 oder die Untergrenze Ihres int "zurückgesetzt" wird (was irgendwo im sein könnte) Bereich von -127 bis -9.223.372.036.854.775.808, abhängig von Ihrer Zielarchitektur ) Was passiert dann in Ihrem Code?
Wenn Sie jedoch einen Bool verwenden, können Sie Folgendes verwenden:
Oder auch:
oder auch:
Abhängig von Ihrem Compiler kann es Optimierungen für Code geben, der Bools verwendet, um zugeordnete True / False-Werte zu speichern. Während es möglicherweise keine Optimierungen für Ints gibt, die zum Speichern zugeordneter wahr / falsch-Werte verwendet werden.
Wir müssen auch daran denken, dass C ++ (zusammen mit C, Assembly und FORTRAN) verwendet wird, um hocheffizienten, kleinen und schnellen Code zu schreiben. Daher ist es in diesem Fall besser, einen Bool zu verwenden - insbesondere, wenn Sie auf die Verwendung von Variablen, Speicher, Cache oder Prozessorzeit hingewiesen werden.
Eine ähnliche Frage wäre: Warum sollte ich eine Ganzzahl (einen Wert) in einem Float speichern? Antwort: Das solltest du nicht, denn es hat keinen Sinn.
Lange Rede, kurzer Sinn: Als Ihr Lehrer / Tutor / Dozent / Professor müssen Sie die Größen verschiedener Werttypen durchgehen (falls Sie sie verpasst haben) und wissen, warum sie in der Softwareentwicklung wichtig sind.
Ich hoffe, das hilft als Ausgangspunkt (ich hoffe auch, dass es nicht pedantisch rüberkommt)
quelle
return value >= 0;
für das erste Beispiel.Der Zweck ist hier die Klarheit der Absicht. Der Rückgabetyp ist Teil einer Funktionsschnittstelle und
bool
sagt Ihnen mehr darüber aus, was Sie von der Funktion erwarten können, als aint
.Auch
BOOL
ist ausdrucksvoller alsint
, obwohl es die gleiche Art ist, zeigt es zumindest Ihre Absicht.Keiner von ihnen ist jedoch das, was ich empfehlen würde:
quelle
Beim Programmieren möchten Sie etwas aus dem realen Leben im Code darstellen. Obwohl ein Int und ein Bool dasselbe tun können, ist die untergeordnete Idee völlig anders: Wenn Sie einen Bool verwenden, lautet die Antwort möglicherweise Ja oder Nein. und das ist alles, das ist die absicht. Mit ganzen Zahlen können Sie Mengen ohne Dezimalstelle darstellen. Und warum sollten Sie in diesem Sinne eine ganze Zahl wählen, wenn ein Double dasselbe kann? Wenn eine Ganzzahl bei der Modellierung des Problems mehr Sinn macht als ein Double, können Sie eine Ganzzahl wählen.
quelle
Denn am Ende werden Sie Ihre Ganzzahl sowieso in einen Booleschen Wert umwandeln: "Wenn (i = 1), dann spielen Sie ein anderes Spiel". In dieser Situation (i = 1) wird in true oder false konvertiert: ein Boolescher Wert.
quelle
if (i = 1)
ist wahrscheinlich die sehr falsche Sache im eigenen Code zu haben.