3 question sur le "type BOOL" en C
Bonjour.
j'ai quelques questions sur le type BOOL en C.
Question 1:
Citation:
Envoyé par faq
(..) il est très simple à 'créer' si le compilateur utilisé ne le propose pas déjà.
#define TRUE 1
#define FALSE 0
typedef int BOOL;
J'ai croisé récemment dans un code:
Code:
1 2 3 4 5 6
|
typedef enum
{
FALSE,
TRUE
} BOOL; |
ça me semble identique à la proposition de la faq, mais j'ai peur de ne pas voir une subtilité. est-ce qu'il y a un cas ou l'utilisation des 2 types BOOL ci-dessus pourrait différer?
Question 2: (edit: j'ai trouvé la réponse à cette question)
Toujours dans un code que j'ai croisé:
une fonction "MaFonction()" retourne un entier: soit 0, soit un nombre différent de 0 (mais pas forcément 1).
le programme faisait:
Code:
1 2 3 4 5
|
int returnValue;
returnValue = MaFonction();
//s'assurer que returnValue vaille 0 ou 1, et rien d'autre
returnValue = !!returnValue; |
Et ça marche. Mais est-ce que cette méthode marche toujours? ou seulement sur le compilateur utilisé (visual C++ 6.0 en l'occurence)
EDIT: réponse: oui, ça marchera toujours
Question 3, et dernière:
Citation:
Envoyé par faq
La notation var1 && var2 correspond au test suivant : si var1 est vrai et que var2 est vrai, ..... alors que la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ....
mais si j'ai:
var1: 00101101
var2: 00100010
alors le var1 & var2 (c'est un "et" bit-à-bit, non?) retourne une valeur non nulle (un "true" si on veut) pourtant je n'ai pas l'impression que "var1 contienne le masque spécifié dans var2". A moins que je ne saisisse mal la notion de "contenir un masque"?
merci de votre aide
EDIT: question 2 résolue: voir ci-dessous
Re: 3 question sur le "type BOOL" en C
Citation:
Envoyé par Biosox
Question 3, et dernière:
Citation:
Envoyé par faq
La notation var1 && var2 correspond au test suivant : si var1 est vrai et que var2 est vrai, ..... alors que la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ....
mais si j'ai:
var1: 00101101
var2: 00100010
alors le var1 & var2 (c'est un "et" bit-à-bit, non?) retourne une valeur non nulle (un "true" si on veut) pourtant je n'ai pas l'impression que "var1 contienne le masque spécifié dans var2". A moins que je ne saisisse mal la notion de "contenir un masque"?
merci de votre aide
var1 && var2 est un test qui est vrai dans le cas ou var1 et var2 sont tous deux differents de 0.
C'est en fait une ecriture simplifiee de (var1 != 0) && (var2 != 0).
var1 & var2 est un 'et' entre var1 et var2.
Une de ses utilisations est la verification de la presence des bits de var2 dans var1, Mais ca ne verifie pas l'integralite du masque.
Ex:
Code:
1 2
|
01011001 & 01000010 -> 01000000. |
En l'occurence, seul 1 bit de var2 est contenu dans var1. Mais le test sera vrai.
Donc tu as raison. L'affirmation "la notation var1 & var2 correspond au test suivant : si var1 contient le masque spécifié par var2, ...." est incorrecte.
Pour verifier que le masque de var2 est integralement contenu dans var1, le test est le suivant:
Code:
1 2
|
if ((var1 & var2) == var2) |
Re: 3 question sur le "type BOOL" en C
Bonjour,
Citation:
Envoyé par Biosox
Question 1:
Je prends :mrgreen:
entre ça :
Code:
1 2 3
| #define TRUE 1
#define FALSE 0
typedef int BOOL; |
et ça :
Code:
1 2 3 4 5
| typedef enum
{
FALSE,
TRUE
} BOOL; |
Il n'y a pas de différence à l'utilisation :
Par contre il faut faire attention car la norme C99 définie un type booléan. Au niveau du compilateur il s'agit du type _Bool qui peut prendre les valeurs 0 et 1. Ceci pour des raisons de compatibilité avec les anciennes sources où il n'est pas rare que les programmeurs aient déjà défini un type Bool, bool ou encore BOOL. Comme les noms commençant par un underscore suivie d'une lettre ou d'un underscore sont réservés par la norme [si tout le monde respecte la norme], il n'y a pas de problème.
Par dessus ceci, vient le fichier stdbool.h qui défini les macro (le fait que ça soit des macro est imposé par la norme) :
Code:
1 2 3 4
| #define TRUE 1
#define FALSE 0
#define bool _Bool
#define __bool_true_false_are_defined |
Donc pour implémenter correctement un type booléan en respectant la norme C90 et C99 il faut écrire quelque chose du genre :
Code:
1 2 3 4 5 6
| #ifndef __bool_true_false_are_defined
# define TRUE 1
# define FALSE 0
# define bool int
# define __bool_true_false_are_defined
#endif |
Re: 3 question sur le "type BOOL" en C
Citation:
Envoyé par Biosox
j'ai quelques questions sur le type BOOL en C.
N'existe pas et de plus est totalement inutile. Une expression logique C retourne 0 ou 1.
Code:
1 2 3
|
printf ("%d\n", 2 < 1);
printf ("%d\n", -1 == 2 - 3); |
Re: 3 question sur le "type BOOL" en C
Citation:
Envoyé par Emmanuel Delahaye
N'existe pas
ça c'est clair. Ma question portait plutot sur la "façon de le créer" (voir question 1 en particulier.)
Citation:
Envoyé par Emmanuel Delahaye
et de plus est totalement inutile.
C'est une question de point de vue. Pour ma part, je pense que "on peut facilement s'en passer" n'implique pas "c'est totalement inutile" (qu'on parle de type BOOL en C ou d'autre chose.
Citation:
Envoyé par Emmanuel Delahaye
Une expression logique C retourne 0 ou 1.
Code:
1 2 3
|
printf ("%d\n", 2 < 1);
printf ("%d\n", -1 == 2 - 3); |
Merci beaucoup pour ces précisions. J'avoue qu'il y avait pour moi une confusion: si je fais un test if(a) ou a est un entier non nul (mais pas forcément 1), le test "passe". du coup j'avais peur qu'une expression logique C retourne 0 ou "un entier non nul indéfini".
Je pense qu'il reste à modifier la faq, plus précisément le point
http://c.developpez.com/faq/c/?page=...Unaire_Binaire
si tout le monde est d'accord avec la réponse de Jack_Serious.
Citation:
Envoyé par Jack_serious
Achetes toi un bouquin de C quand meme ca sert toujours
Je vous rassure tous (surtout Gnux: responsables livres), j'ai un bouquin de C! c'est la "bible du programmeur C/C++". Mais je suis en déplacement en ce moment, et ce bouquin prend à lui seul la moitié du volume de ma valise. Donc je l'ai laissé bien au chaud à la maison ;)