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

C99

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

C99

_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), wird z zu 0 wenn X == 0 . Ansonsten wird z zu 1 .
  • Wenn X einen Zeigertyp hat, wird z zu 0 wenn X ein Nullzeiger ist, andernfalls 1 .

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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow