C Language
Boolean
Suche…
Bemerkungen
Um den vordefinierten Typ _Bool
und den Header <stdbool.h>
, müssen Sie die C99 / C11-Versionen von C verwenden.
Um Compiler-Warnungen und möglicherweise Fehler zu vermeiden, sollten Sie das typedef
/ define
Beispiel nur verwenden define
wenn Sie C89 und frühere Versionen der Sprache verwenden.
Stdbool.h verwenden
Mit der stdbool.h
können Sie bool
als booleschen Datentyp verwenden. true
ergibt 1
und false
ergibt 0
.
#include <stdio.h>
#include <stdbool.h>
int main(void) {
bool x = true; /* equivalent to bool x = 1; */
bool y = false; /* equivalent to bool y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
bool
ist nur eine schöne Schreibweise für den Datentyp _Bool
. Es gibt spezielle Regeln, wenn Zahlen oder Zeiger in ihn umgewandelt werden.
#Define verwenden
C allen Versionen wird behandeln effektiv jeden Integer - Wert anders als 0
als true
für Vergleichsoperator und den ganzzahligen Wert 0
als false
. Wenn Sie nicht über _Bool
oder bool
als von C99 zur Verfügung, könnten Sie einen Booleschen Datentyp in C unter Verwendung simulieren #define
Makros, und Sie können immer noch solche Dinge in Legacy - Code finden.
#include <stdio.h>
#define bool int
#define true 1
#define false 0
int main(void) {
bool x = true; /* Equivalent to int x = 1; */
bool y = false; /* Equivalent to int y = 0; */
if (x) /* Functionally equivalent to if (x != 0) or if (x != false) */
{
puts("This will print!");
}
if (!y) /* Functionally equivalent to if (y == 0) or if (y == false) */
{
puts("This will also print!");
}
}
<stdbool.h>
Sie dies nicht in neuem Code ein, da die Definition dieser Makros mit der modernen Verwendung von <stdbool.h>
.
Verwendung des eingebauten (integrierten) Typs _Bool
_Bool
in der C-Standardversion C99 _Bool
ist ebenfalls ein nativer C-Datentyp. Es kann die Werte 0
(für falsch ) und 1
(für wahr ) halten.
#include <stdio.h>
int main(void) {
_Bool x = 1;
_Bool y = 0;
if(x) /* Equivalent to if (x == 1) */
{
puts("This will print!");
}
if (!y) /* Equivalent to if (y == 0) */
{
puts("This will also print!");
}
}
_Bool
ist ein Integer-Typ, hat jedoch spezielle Regeln für Konvertierungen von anderen Typen. Das Ergebnis ist analog zur Verwendung anderer Typen in if
Ausdrücken . Im Folgenden
_Bool z = X;
- Wenn
X
einen arithmetischen Typ hat (ist eine beliebige Zahl), wirdz
zu0
wennX == 0
. Ansonsten wirdz
zu1
. - Wenn
X
einen Zeigertyp hat, wirdz
zu0
wennX
ein Nullzeiger ist, andernfalls1
.
So verwenden schöner Schreibweisen bool
, false
und true
Sie verwenden müssen <stdbool.h>
.
Ganzzahlen und Zeiger in booleschen Ausdrücken.
Alle Ganzzahlen oder Zeiger können in einem Ausdruck verwendet werden, der als "Wahrheitswert" interpretiert wird.
int main(int argc, char* argv[]) {
if (argc % 4) {
puts("arguments number is not divisible by 4");
} else {
puts("argument number is divisible by 4");
}
...
Der Ausdruck argc % 4
wird ausgewertet und führt zu einem der Werte 0
, 1
, 2
oder 3
. Der erste, 0
ist der einzige Wert, der "false" ist und die Ausführung in den else
Teil bringt. Alle anderen Werte sind "true" und gehen in den if
Teil über.
double* A = malloc(n*sizeof *A);
if (!A) {
perror("allocation problems");
exit(EXIT_FAILURE);
}
Hier wird der Zeiger A
ausgewertet und wenn es sich um einen Nullzeiger handelt, wird ein Fehler erkannt und das Programm beendet.
Viele Leute schreiben lieber etwas als A == NULL
, aber wenn Sie solche Zeigervergleiche als Teil anderer komplizierter Ausdrücke haben, werden die Dinge schnell schwer zu lesen.
char const* s = ....; /* some pointer that we receive */
if (s != NULL && s[0] != '\0' && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
Um dies zu überprüfen, müssen Sie einen komplizierten Code im Ausdruck scannen und die Präferenzen des Bedieners beachten.
char const* s = ....; /* some pointer that we receive */
if (s && s[0] && isalpha(s[0])) {
printf("this starts well, %c is alphabetic\n", s[0]);
}
ist relativ einfach zu erfassen: Wenn der Zeiger gültig ist, prüfen wir, ob das erste Zeichen ungleich Null ist, und prüfen, ob es sich um einen Buchstaben handelt.
Definieren eines Bool-Typs mit Typedef
In Anbetracht der Tatsache, dass die meisten Debugger keine # #define
Makros kennen, aber enum
überprüfen können, ist es möglicherweise wünschenswert, Folgendes zu tun:
#if __STDC_VERSION__ < 199900L
typedef enum { false, true } bool;
/* Modern C code might expect these to be macros. */
# ifndef bool
# define bool bool
# endif
# ifndef true
# define true true
# endif
# ifndef false
# define false false
# endif
#else
# include <stdbool.h>
#endif
/* Somewhere later in the code ... */
bool b = true;
Dadurch können Compiler für ältere Versionen von C funktionieren, sie bleiben jedoch vorwärtskompatibel, wenn der Code mit einem modernen C-Compiler kompiliert wird.
Weitere Informationen zu typedef
finden Sie unter Typedef. Weitere Informationen zu enum
Sie unter Aufzählungen