Sök…


Anmärkningar

För att använda den fördefinierade typen _Bool och rubriken <stdbool.h> måste du använda C99 / C11-versionerna av C.

För att undvika kompilatorvarningar och eventuellt fel bör du bara använda typedef / define exemplet om du använder C89 och tidigare versioner av språket.

Använda stdbool.h

C99

Med hjälp av systemhuvudfilen stdbool.h kan du använda bool som en boolesk datatyp. true utvärderingar till 1 och false utvärderingar till 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 är bara en fin stavning för _Bool . Den har speciella regler när nummer eller pekare konverteras till det.

Med #define

C av alla versioner, kommer effektivt att behandla alla heltal utanför 0 som true för jämförelseoperatörer och heltalvärdet 0 som false . Om du inte har _Bool eller bool från och med C99 tillgängliga, kan du simulera en boolesisk datatyp i C med #define makron och du kan fortfarande hitta sådana saker i äldre kod.

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

Inför inte detta i ny kod eftersom definitionen av dessa makron kan kollidera med modern användning av <stdbool.h> .

Använda den inneboende (inbyggda) typen _Bool

C99

Tillagd i C-standardversionen C99 är _Bool också en inbyggd C-datatyp. Den kan hålla värdena 0 (för falskt ) och 1 (för sant ).

#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 är en heltalstyp men har speciella regler för konverteringar från andra typer. Resultatet är analog med användningen av andra typer av if uttrycken . I följande

_Bool z = X;
  • Om X har en aritmetisk typ (är valfritt antal) blir z 0 om X == 0 . Annars blir z 1 .
  • Om X har en pekartyp blir z 0 om X är en nollpekare och 1 annars.

För att använda trevligare stavningar bool , false och true måste du använda <stdbool.h> .

Heltal och pekare i Booleska uttryck.

Alla heltal eller pekare kan användas i ett uttryck som tolkas som "sanningsvärde".

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

Uttrycket argc % 4 utvärderas och leder till ett av värdena 0 , 1 , 2 eller 3 . Den första, 0 är det enda värdet som är "falskt" och leder exekvering till den else delen. Alla andra värden är "sanna" och går in i if delen.

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

Här utvärderas pekaren A och om det är en nollpekare upptäcks ett fel och programmet avslutas.

Många föredrar att skriva något som A == NULL istället, men om du har sådana pekarjämförelser som en del av andra komplicerade uttryck, blir saker snabbt svåra att läsa.

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

För att detta ska kunna kontrolleras måste du skanna en komplicerad kod i uttrycket och vara säker på operatörens preferenser.

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

är relativt lätt att fånga: om pekaren är giltig kontrollerar vi om det första tecknet är icke-noll och kontrollerar sedan om det är en bokstav.

Definiera en booltyp med typedef

Med tanke på att de flesta felsökare inte är medvetna om #define makron, men kan kontrollera enum , kan det vara önskvärt att göra något liknande:

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

Detta gör att kompilatorer för historiska versioner av C kan fungera, men förblir kompatibla framåt om koden är kompilerad med en modern C-kompilator.

För mer information om typedef , se Typedef , för mer om enum se Enumerations



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow