Das Wichtigste zuerst. C, d.h. ISO/IEC 9899, hat einen booleschen Typ für 19 Jahre jetzt . Das ist viel mehr Zeit als die erwartet Länge der C-Programmierkarriere mit Amateur-/Akademiker-/Berufsanteil bei Besuch diese Frage . Meiner übertrifft das nur um vielleicht 1-2 Jahre. Das bedeutet, dass während der Zeit dass ein durchschnittlicher Leser überhaupt etwas über C gelernt hat, hat C tatsächlich den booleschen Datentyp .
Für den Datentyp, #include <stdbool.h>
und verwenden true
, false
y bool
. Oder lassen Sie es weg und verwenden Sie _Bool
, 1
y 0
stattdessen.
Es gibt verschiedene gefährlich Praktiken, die in den anderen Antworten zu diesem Thema angesprochen wurden. Ich werde sie ansprechen:
typedef int bool;
#define true 1
#define false 0
Das geht nicht, denn ein gelegentlicher Leser - der in diesen 19 Jahren C gelernt hat - würde erwarten, dass bool
bezieht sich auf die aktuell bool
Datentyp und würde sich ähnlich verhalten, tut es aber nicht! Zum Beispiel
double a = ...;
bool b = a;
Mit C99 bool
/ _Bool
, b
würde auf false
wenn a
war Null, und true
sonst. C11 6.3.1.2p1
- Wenn ein beliebiger Einzelwert in
_Bool
ist das Ergebnis 0, wenn der Vergleichswert gleich 0 ist; andernfalls ist das Ergebnis 1. 59)
Fußnoten
59) NaNs werden nicht mit 0 gleichgesetzt und daher in 1 umgewandelt.
Mit dem typedef
an Ort und Stelle, die double
gezwungen werden würde, eine int
- wenn der Wert des Double nicht in dem Bereich liegt, der für int
die Verhalten ist undefiniert .
Das Gleiche gilt natürlich auch für den Fall, dass true
y false
wurden in einer enum
.
Was ist überhaupt gefährlicher erklärt, dass
typedef enum bool {
false, true
} bool;
denn jetzt alle Werte außer 1 und 0 sind ungültig, und sollte ein solcher Wert einer Variablen dieses Typs zugewiesen werden, das Verhalten wäre völlig undefiniert .
Deshalb wenn können Sie aus unerklärlichen Gründen nicht C99 verwenden, für boolesche Variablen sollten Sie:
- Typ
int
und Werte 0
y 1
wie besehen ; und führen Sie vorsichtig Domänenumwandlungen von anderen Werten in diese mit doppelter Negation durch !!
- oder wenn Sie darauf bestehen Sie sich nicht daran erinnern, dass 0 falsy und ungleich Null truish ist, verwenden Sie zumindest Großbuchstaben damit sie nicht mit den C99-Konzepten verwechselt werden:
BOOL
, TRUE
y FALSE
!
93 Stimmen
C hat einen booleschen Typ. Zumindest gibt es einen in den neuesten Standards.
12 Stimmen
stackoverflow.com/questions/1608318/is-bool-a-native-c-type/