Zoeken…


Opmerkingen

Als u het vooraf gedefinieerde type _Bool en de kop <stdbool.h> , moet u de C99 / C11-versies van C gebruiken.

Om compilerwaarschuwingen en mogelijk fouten te voorkomen, moet u het typedef / define voorbeeld alleen gebruiken als u C89 en eerdere versies van de taal gebruikt.

Stdbool.h gebruiken

C99

Met behulp van het systeemkopbestand stdbool.h kunt u bool als een Boolean-gegevenstype. true resulteert in 1 en false in 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 is gewoon een leuke spelling voor het gegevenstype _Bool . Het heeft speciale regels wanneer getallen of verwijzingen ernaar worden geconverteerd.

#Define gebruiken

C van alle versies, zal effectief elke gehele waarde anders dan 0 als true voor vergelijkingsoperatoren en de gehele waarde 0 als false . Als u niet beschikt over _Bool of bool als van C99 beschikbaar is, kunt u een Boolean data type in C simuleren met behulp van #define macro's, en je zou nog steeds zulke dingen in legacy code te vinden.

#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!");
    }
}

Voer dit niet in nieuwe code in, omdat de definitie van deze macro's kan botsen met modern gebruik van <stdbool.h> .

Gebruik van het intrinsieke (ingebouwde) type _Bool

C99

_Bool is toegevoegd in de C-standaardversie C99 en is ook een native C-gegevenstype. Het kan de waarden 0 (voor onwaar ) en 1 (voor waar ) bevatten.

#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 is een geheel getal, maar heeft speciale regels voor conversies van andere typen. Het resultaat is analoog aan het gebruik van andere typen in if expressies . In de volgende

_Bool z = X;
  • Als X een rekenkundig type heeft (is een willekeurig getal), wordt z 0 als X == 0 . Anders wordt z 1 .
  • Als X een pointertype heeft, wordt z 0 als X een nulwijzer is en anders 1 .

Om mooiere spelling bool , false en true te gebruiken, moet je <stdbool.h> .

Gehele getallen en verwijzingen in Booleaanse uitdrukkingen.

Alle gehele getallen of verwijzingen kunnen worden gebruikt in een uitdrukking die wordt geïnterpreteerd als "waarheidswaarde".

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");
  }
...

De uitdrukking argc % 4 wordt geëvalueerd en leidt tot een van de waarden 0 , 1 , 2 of 3 . De eerste, 0 is de enige waarde die "false" is en brengt uitvoering in het else deel. Alle andere waarden zijn "waar" en gaan in het if gedeelte.

double* A = malloc(n*sizeof *A);
if (!A) {
   perror("allocation problems");
   exit(EXIT_FAILURE);
}

Hier wordt de aanwijzer A geëvalueerd en als het een nulaanwijzer is, wordt een fout gedetecteerd en wordt het programma afgesloten.

Veel mensen schrijven liever iets als A == NULL , maar als u dergelijke vergelijkingen van aanwijzers hebt als onderdeel van andere gecompliceerde uitdrukkingen, worden dingen snel moeilijk te lezen.

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]);
}

Om dit te controleren, moet u een gecompliceerde code in de uitdrukking scannen en zeker zijn van de voorkeur van de operator.

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]);
}

is relatief eenvoudig vast te leggen: als de aanwijzer geldig is, controleren we of het eerste teken niet nul is en controleren we of het een letter is.

Een bool-type definiëren met typedef

Aangezien de meeste debuggers niet op de hoogte zijn van #define macro's, maar enum constanten kunnen controleren, kan het wenselijk zijn om zoiets te doen:

#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;

Hierdoor kunnen compilers voor historische versies van C werken, maar blijven ze compatibel als de code wordt gecompileerd met een moderne C-compiler.

Voor meer informatie over typedef , zie typedef , voor meer informatie over enum zien Opsommingen



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow