Ricerca…


Osservazioni

Per utilizzare il tipo predefinito _Bool e l'intestazione <stdbool.h> , è necessario utilizzare le versioni C99 / C11 di C.

Per evitare avvisi del compilatore ed eventualmente errori, dovresti usare l'esempio typedef / define se stai usando C89 e le versioni precedenti della lingua.

Utilizzando stdbool.h

C99

Utilizzando il file di intestazione di sistema stdbool.h consente di utilizzare bool come tipo di dati booleano. true restituisce 1 e false valuta a 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 è solo una bella ortografia per il tipo di dati _Bool . Ha regole speciali quando vengono convertiti numeri o puntatori.

Utilizzando #define

C di tutte le versioni, tratterà efficacemente qualsiasi valore intero diverso da 0 come true per gli operatori di confronto e il valore intero 0 come false . Se non si dispone di _Bool o bool partire da C99, è possibile simulare un tipo di dati booleano in C utilizzando le macro #define e si potrebbero ancora trovare tali elementi nel codice legacy.

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

Non introdurre questo nel nuovo codice poiché la definizione di queste macro potrebbe essere in conflitto con gli usi moderni di <stdbool.h> .

Uso del tipo _Bool intrinseco (incorporato)

C99

Aggiunto nella versione C standard C99, _Bool è anche un tipo di dati C nativo. È in grado di contenere i valori 0 (per falso ) e 1 (per vero ).

#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 è un tipo intero ma ha regole speciali per le conversioni di altri tipi. Il risultato è analogo all'uso di altri tipi in if espressioni . Nel seguente

_Bool z = X;
  • Se X ha un tipo aritmetico (è un qualsiasi tipo di numero), z diventa 0 se X == 0 . Altrimenti, z diventa 1 .
  • Se X ha un tipo di puntatore, z diventa 0 se X è un puntatore nullo e 1 altrimenti.

Per usare le <stdbool.h> più belle bool , false e true devi usare <stdbool.h> .

Numeri interi e puntatori nelle espressioni booleane.

Tutti gli interi oi puntatori possono essere utilizzati in un'espressione interpretata come "valore di verità".

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

L'espressione argc % 4 viene valutata e porta a uno dei valori 0 , 1 , 2 o 3 . Il primo, 0 è l'unico valore che è "falso" e porta l'esecuzione nella parte else . Tutti gli altri valori sono "veri" e vanno nella parte if .

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

Qui viene valutato il puntatore A e, se si tratta di un puntatore nullo, viene rilevato un errore e il programma viene chiuso.

Molte persone preferiscono scrivere qualcosa come A == NULL , invece, ma se si dispone di confronti di puntatore come parte di altre espressioni complicate, le cose diventano rapidamente difficili da leggere.

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

Per fare ciò, dovresti eseguire la scansione di un codice complicato nell'espressione e accertarti delle preferenze dell'operatore.

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

è relativamente facile da catturare: se il puntatore è valido controlliamo se il primo carattere è diverso da zero e quindi controlla se è una lettera.

Definire un tipo di bool usando typedef

Considerando che la maggior parte dei debugger non conoscono le macro #define , ma possono controllare le costanti enum , potrebbe essere opportuno fare qualcosa del genere:

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

Ciò consente ai compilatori per le versioni storiche di C di funzionare, ma rimane compatibile in avanti se il codice è compilato con un compilatore C moderno.

Per maggiori informazioni su typedef , vedi Typedef , per ulteriori informazioni su enum consulta Enumerazioni



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow