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