C Language
booleano
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
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)
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
diventa0
seX == 0
. Altrimenti,z
diventa1
. - Se
X
ha un tipo di puntatore,z
diventa0
seX
è un puntatore nullo e1
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