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
Xeinen arithmetischen Typ hat (ist eine beliebige Zahl), wirdzzu0wennX == 0. Ansonsten wirdzzu1. - Wenn
Xeinen Zeigertyp hat, wirdzzu0wennXein 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