web-dev-qa-db-fra.com

'Bool' est-il un type de données de base en C ++?

J'ai eu ce doute en écrivant du code. 'Bool' est-il un type de données de base défini dans la norme C++ ou est-ce une sorte d'extension fournie par le compilateur? J'ai ce doute parce que Win32 a 'BOOL' qui n'est rien d'autre qu'un typedef de long. Et que se passe-t-il si je fais quelque chose comme ça:

int i = true;

Est-il "toujours" garanti que la variable i aura la valeur 1 ou est-ce que cela dépend à nouveau du compilateur que j'utilise? De plus, pour certaines API Win32 qui acceptent BOOL comme paramètre, que se passe-t-il si je passe la variable bool?

57
Naveen

bool est un type de données fondamental en C++. La conversion de true en un type entier donnera 1, et la conversion de false donnera 0 (4,5/4 et 4,7/4). En C, jusqu'à C99, il n'y avait pas de type de données booléen, et les gens faisaient des trucs comme

enum bool {
    false, true
};

L'API Windows aussi. À partir de C99, nous avons _Bool comme type de données de base. Comprenant stdbool.h volonté typedef #define à bool et fournissez les constantes true et false. Ils n'ont pas fait de bool un type de données de base (et donc un mot-clé) en raison de problèmes de compatibilité avec le code existant.

76

Oui, bool est un type intégré.

WIN32 est du code C, pas C++, et C n'a pas de booléen, donc ils fournissent leur propre BOOL typedef.

8
jalf

C++ fait beaucoup de transtypage automatique pour vous - c'est-à-dire, si vous avez une variable de type bool et la passez à quelque chose qui attend un int, elle en fera un int pour toi - 0 pour false et 1 pour true.

Je n'ai pas mon standard pour voir si cela est garanti, mais tous les compilateurs que j'ai utilisés le font (donc on peut supposer que cela fonctionnera toujours).

Cependant, s'appuyer sur cette conversion est une mauvaise idée. Le code peut arrêter la compilation si une nouvelle méthode est ajoutée qui surcharge la signature int, etc.

5
hazzen

oui, il a été introduit en 1993.

pour plus d'informations: type de données booléen

2
John T

C est censé être une étape au-dessus du langage d'assemblage. L'instruction C if n'est en fait que du sucre syntaxique pour "branch-if-zero", donc l'idée des booléens comme type de données indépendant était un concept étranger à l'époque. (1)

Même maintenant, les booléens C/C++ ne sont généralement guère plus qu'un alias pour un type de données à un octet. En tant que tel, il s'agit vraiment plus d'une étiquette de but que d'un type de données indépendant.

(1) Bien sûr, les compilateurs modernes sont un peu plus avancés dans la gestion des instructions if. C'est du point de vue de C en tant que nouveau langage.

1
jdmichal

Le compilateur Turbo c et c ++ ne prend pas en charge le type de données booléen (mot clé bool) mais le compilateur dev c ++ prend en charge le type de données booléen (mot clé bool).

0
Anish