Soweit ich sehen kann, gibt es in c drei Möglichkeiten, Boolesche Werte zu verwenden
- mit dem Bool-Typ, von da an mit true und false
- Definieren mit Präprozessor
#define FALSE 0 ... #define TRUE !(FALSE)
- Nur um Konstanten direkt zu verwenden, dh 1 und 0
Gibt es andere Methoden, die ich verpasst habe? Was sind die Vor- und Nachteile der verschiedenen Methoden?
Ich nehme an, die schnellste wäre Nummer 3, 2 ist noch leichter lesbar (obwohl die bitweise Negation den Overhead geringfügig erhöht), 1 ist am besten lesbar und nicht mit allen Compilern kompatibel.
c
coding-style
Tom
quelle
quelle
int i = 12 + 3 * 4;
. es wird nur sagenint i = 24;
. Sorgen Sie sich nicht schlecht um solche Leistung, ein häufiges Problem. Optimierungen kommen als letztes , und wenn sie kommen, müssen Sie Ihren Code zeitlich festlegen und die Assembly-Ausgabe betrachten, nicht raten. Selbst wenn es einen Zyklus kosten würde, würde ich mich für die am besten lesbare Lösung entscheiden. Nur als es sich als a(x == TRUE)
nicht dasselbe ist wie(x)
. Ersteres gilt nur, wennx
der Wert von giltTRUE
. Letzteres gilt für jeden Wert ungleich Null.if(foo == TRUE)
oder zu schreibenif(foo == FALSE)
, was in den meisten Sprachen eine Gräueltat ist, aber noch mehr in C, wo jeder skalare Wert!= 0
in booleschen Kontexten als wahr angesehen wird. aus ähnlichen, aber weniger schwerwiegenden Gründen mag ich nichtif(foo != NULL)
undif(foo == NULL)
für Hinweise; Da dies keine Fehler im Vergleich zu Dosen einführenTRUE
kann, ist es nur eine Frage des Geschmacks, aber die Verwendungif(foo)
undif(!foo)
für jeden skalaren Wert entspricht imo mehr dem Look-and-Feel der C-SpracheAntworten:
Geben
<stdbool.h>
Sie einfach an, ob Ihr System dies bereitstellt. Dies definiert eine Anzahl von Makros, einschließlichbool
,false
undtrue
(definiert als_Bool
, 0 bzw. 1). Weitere Informationen finden Sie in Abschnitt 7.16 von C99.quelle
_Bool
ohne Einbeziehung verwendenstdbool.h
Verwenden Sie einfach 0 oder 1 direkt im Code.
Für C-Programmierer ist dies so intuitiv wie wahr oder falsch.
quelle
int
Typ) verwendet wird, macht es manchmal nicht offensichtlich, ob ein Wert in einem booleschen Kontext verwendet werden soll.int fail = close(fd); if (!fail) { great(); } else { weep(); }
Normalerweise mache ich:
typedef enum {FALSE = 0, TRUE} boolean;
quelle
FileNotFound
die Vorderseite dieser Aufzählung ergänzen . ;-)Beim definierten Bool-Typ stdbool.h treten Probleme auf, wenn Sie Code von einem neueren Compiler, der den Bool-Typ unterstützt, in einen älteren Compiler verschieben müssen. Dies kann in einer eingebetteten Programmierumgebung passieren, wenn Sie mit einem C-Compiler, der auf einer älteren Version der Spezifikation basiert, zu einer neuen Architektur wechseln.
Zusammenfassend würde ich mich an die Makros halten, wenn Portabilität wichtig ist. Andernfalls tun Sie, was andere empfehlen, und verwenden Sie den Typ Bulit.
quelle
Unabhängig davon, mit welchen der drei Variablen Sie arbeiten, vergleichen Sie Ihre Variablen mit FALSE oder false.
Historisch gesehen ist es eine schlechte Idee, irgendetwas mit true (1) in c oder c ++ zu vergleichen. Nur false ist garantiert Null (0). True ist jeder andere Wert . Viele Compiler-Anbieter haben diese Definitionen irgendwo in ihren Headern.
#define TRUE 1 #define FALSE 0
Dies hat zu viele Menschen den Gartenweg entlang geführt. Viele Bibliotheksfunktionen geben außerdem
chartype
Werte ungleich Null zurück, die1
bei Erfolg nicht gleich sind . Es gibt eine Menge Legacy-Code mit demselben Verhalten.quelle
Sie können testen, ob bool in c99 stdbool.h mit definiert ist
#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0 //typedef or define here #endif
quelle
__bool_true_false_are_defined
.Ich würde für 1 gehen. Ich habe keine Inkompatibilität damit getroffen und ist natürlicher. Aber ich denke, dass es ein Teil von C ++ ist, nicht C-Standard. Ich denke, dass mit schmutzigem Hacken mit Definitionen oder Ihrer dritten Option keine Leistung erzielt wird, sondern nur Schmerzen bei der Pflege des Codes.
quelle
bool
ist Teil von C ++, aber _Bool (mitbool
als Alias) ist jetzt Teil von C (ab C99).Ich bevorzuge (1), wenn ich eine Variable definiere, aber in Ausdrücken vergleiche ich nie mit wahr und falsch. Nimm einfach die implizite C-Definition von if (flag) oder if (! Flag) oder if (ptr). Das ist die C-Art, Dinge zu tun.
quelle
Jedes andere int als Null ist wahr; false ist Null. Auf diese Weise funktioniert Code wie dieser weiterhin wie erwartet:
int done = 0; // `int` could be `bool` just as well while (!done) { // ... done = OS_SUCCESS_CODE == some_system_call (); }
IMO
bool
ist ein überbewerteter Typ, möglicherweise eine Übertragung aus anderen Sprachen.int
funktioniert gut als boolescher Typ.quelle
bool
handelt es sich um einen separaten Typ, der an der Funktionsüberladung teilnehmen kann, aus dem gleichen Grund, warum Zeichenkonstantenchar
in C ++ vom Typ sind . Dies gilt natürlich nicht für C, das keine Funktionsüberladung aufweist._Bool
in boolesche Kontexte konvertieren , eine Funktion, die auch in vielen dynamischen Sprachen zu finden ist_Bool
ist, dass der Compiler es so speichern kann, wie es am besten funktioniert (ein Byte, ein Wort, ein bisschen, was auch immer). Vielleicht haben Sie sogar die Möglichkeit, die Größe beim Kompilieren zu bestimmen (wie bei einigen Compilern, bei denen Sieint
2 oder 4 Bytes oderlong
4 oder 8 Bytes angeben können ). Haben Sie einen Prozessor, der auf Dinge als Wörter zugreifen möchte? Machen Sie_Bool
die Wortgröße. Greift Ihr Prozessor so einfach auf Bytes zu wie auf Wörter? Machen Sie es zu einem Byte, um Platz zu sparen. Haben Sie Anweisungen für den Bitzugriff? Vielleicht, vielleicht nicht. Fortsetzung der langen Tradition von C, keineint
Größen festzunageln ...Früher habe ich #define verwendet, weil sie das Lesen von Code erleichtern und es keine Leistungseinbußen im Vergleich zur Verwendung von Zahlen (0,1) geben sollte, da der Präprozessor #define vor dem Kompilieren in Zahlen konvertiert. Sobald die Anwendung ausgeführt wird, kommt der Präprozessor nicht mehr in den Weg, da der Code bereits kompiliert ist.
Übrigens sollte es sein:
#define FALSE 0 #define TRUE 1
und denken Sie daran, dass -1, -2, ... 2, 3 usw. alle als wahr ausgewertet werden.
quelle
!1
0 zurückgegeben wird, aber!0
ein wahrer Wert zurückgegeben wird, der eine Vielzahl von Zahlen sein kann.#define TRUE !(FALSE)
stellt sicher, dassTRUE == !0
unabhängig davon, welcher genaue Wert!0
zurückgegeben wird.Ich kenne dich nicht spezifisch. Als ich C-Programme schrieb, haben wir immer # 2 verwendet.
#define FALSE = 0 #define TRUE = !FALSE
Dies könnte ansonsten unter fremder Plattform für DOS- oder Intel-basierte Prozessoren sein. Aber ich habe sowohl C als auch ASM zusammen verwendet, um Grafikbibliotheken und grafische IDE zu schreiben. Ich war ein echter Fan von Micheal Abrash und wollte etwas über Textur-Mapping und so lernen. Wie auch immer! Das ist hier nicht das Thema der Frage!
Dies war die am häufigsten verwendete Form zum Definieren von Booleschen Werten in C, da diese Headerdatei stdbool.h damals nicht vorhanden war.
quelle
#define TRUE = 1
?Es gibt keinen wirklichen Geschwindigkeitsunterschied. Für den Compiler sind sie wirklich alle gleich. Der Unterschied besteht darin, dass die Menschen versuchen, Ihren Code zu verwenden und zu lesen.
Für mich ist Bool, True und False die beste Wahl für C ++ - Code. In C-Code gibt es einige Compiler, die Bool nicht unterstützen (ich muss oft mit alten Systemen arbeiten), daher kann ich unter bestimmten Umständen mit den Definitionen arbeiten.
quelle
Kein ISO C-Compiler hat einen eingebauten Typ namens
bool
. ISO C99-Compiler haben einen Typ_Bool
und einen Header, der typedef istbool
. Kompatibilität bedeutet also einfach, einen eigenen Header bereitzustellen, wenn der Compiler nicht C99-kompatibel ist (z. B. VC ++).Ein einfacherer Ansatz ist natürlich, Ihren C-Code als C ++ zu kompilieren.
quelle
Ich bevorzuge die dritte Lösung, dh die Verwendung von 1 und 0, da sie besonders nützlich ist, wenn Sie testen müssen, ob eine Bedingung wahr oder falsch ist: Sie können einfach eine Variable für das if-Argument verwenden.
Wenn Sie andere Methoden verwenden, sollte ich, um mit dem Rest des Codes übereinzustimmen, einen Test wie den folgenden verwenden:
if (variable == TRUE) { ... }
anstatt:
if (variable) { ... }
quelle
Ich benutze lieber
#define FALSE (0!=0) #define TRUE (0==0)
oder direkt im Code
if (flag == (0==0)) { ... }
Der Compiler wird sich darum kümmern. Ich benutze viele Sprachen und es stört mich sehr, dass ich daran denken muss, dass FALSE 0 ist. aber wenn ich muss, denke ich normalerweise an diese String-Schleife
do { ... } while (*ptr);
und das lässt mich sehen, dass FALSE 0 ist
quelle