Recherche…


Remarques

Pour utiliser le type prédéfini _Bool et l'en-tête <stdbool.h> , vous devez utiliser les versions C99 / C11 de C.

Pour éviter les avertissements du compilateur et éventuellement les erreurs, utilisez uniquement l'exemple typedef / define si vous utilisez C89 et les versions précédentes du langage.

Utiliser stdbool.h

C99

L'utilisation du fichier d'en-tête système stdbool.h vous permet d'utiliser bool comme un type de données booléen. true 1 et false true 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 est juste une belle orthographe pour le type de données _Bool . Il a des règles spéciales lorsque les nombres ou les pointeurs y sont convertis.

Utiliser #define

C de toutes les versions, traitera efficacement toute valeur entière autre que 0 comme true pour les opérateurs de comparaison et la valeur entière 0 comme étant false . Si vous ne disposez pas de _Bool ou bool partir de C99, vous pouvez simuler un type de données booléen en C à l'aide de macros #define , et vous pouvez toujours trouver ces éléments dans le code hérité.

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

N'introduisez pas cela dans un nouveau code car la définition de ces macros pourrait être en <stdbool.h> avec les utilisations modernes de <stdbool.h> .

Utilisation de _Bool de type intrinsèque (intégré)

C99

Ajouté dans la version C standard C99, _Bool est également un type de données C natif. Il est capable de contenir les valeurs 0 (pour false ) et 1 (pour true ).

#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 est un type entier mais a des règles spéciales pour les conversions d'autres types. Le résultat est analogue à l'utilisation d'autres types dans les expressions if . Dans ce qui suit

_Bool z = X;
  • Si X a un type arithmétique (est un type quelconque de nombre), z devient 0 si X == 0 . Sinon, z devient 1 .
  • Si X a un type de pointeur, z devient 0 si X est un pointeur nul et 1 sinon.

Pour utiliser les orthographes plus belles bool , false et true vous devez utiliser <stdbool.h> .

Entiers et pointeurs dans les expressions booléennes.

Tous les entiers ou pointeurs peuvent être utilisés dans une expression interprétée comme "valeur de vérité".

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'expression argc % 4 est évaluée et conduit à l'une des valeurs 0 , 1 , 2 ou 3 . Le premier, 0 est la seule valeur qui est "false" et amène l'exécution dans la partie else . Toutes les autres valeurs sont "vraies" et vont dans la partie if .

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

Ici, le pointeur A est évalué et s'il s'agit d'un pointeur nul, une erreur est détectée et le programme se ferme.

Beaucoup de gens préfèrent écrire quelque chose comme A == NULL , mais si vous faites de telles comparaisons avec d'autres expressions compliquées, les choses deviennent rapidement difficiles à lire.

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

Pour ce faire, vous devez analyser un code compliqué dans l'expression et être sûr de la préférence de l'opérateur.

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

est relativement facile à capturer: si le pointeur est valide, nous vérifions si le premier caractère est différent de zéro et vérifions ensuite s'il s'agit d'une lettre.

Définir un type bool en utilisant typedef

Étant donné que la plupart des débogueurs ne connaissent pas les macros #define , mais peuvent vérifier les constantes d' enum , il peut être souhaitable de faire quelque chose comme ceci:

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

Cela permet aux compilateurs pour les versions historiques de C de fonctionner, mais reste compatible avec le futur si le code est compilé avec un compilateur C moderne.

Pour plus d'informations sur typedef , voir Typedef , pour plus d'informations sur enum voir Enumérations



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow