web-dev-qa-db-fra.com

bool to int conversion

A quel point cette conversion est-elle portable? Puis-je être sûr que les deux affirmations passent?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

Ne demande pas pourquoi. Je sais que c'est moche. Je vous remercie.

114
pic11
int x = 4<5;

Complètement portable. Conforme à la norme. bool à int la conversion est implicite!

§4.7/4 de la norme C++ dit (Intégrale Conversion )

Si le type de source est bool, la valeur false est convertie en zéro et la valeur true est convertie en un.


En ce qui concerne C, autant que je sache, il n'y a pas de bool en C. (avant 1999) Donc, la conversion de bool à int ne concerne que C++. En C, 4<5 évalue à int valeur, dans ce cas la valeur est 1, 4>5 évaluerait à 0.

EDIT: Jens dans le commentaire a déclaré, C99 a _Bool type. bool est une macro définie dans stdbool.h En tête de fichier. true et false sont également des macros définies dans stdbool.h.

Le §7.16 de C99 dit:

La macro bool se développe en _Bool.

[..] true qui se développe à la constante entière 1, false qui se développe à la constante entière 0, [..]

179
Nawaz

Vous avez balisé votre question [C] et [C++] en même temps. Les résultats seront cohérents entre les langues, mais la structure de la réponse est différente pour chacune de ces langues.

En langage C, vos exemples n’ont aucune relation avec bool (cela s’applique également à C99). En langage C, les opérateurs relationnels ne produisent pas de résultats bool. Tous les deux 4 > 5 et 4 < 5 sont des expressions qui produisent des résultats de type int avec les valeurs 0 ou 1. Donc, il n'y a pas de conversion de type "bool to int" dans vos exemples en C.

En C++, les opérateurs relationnels produisent bien bool résultats. bool les valeurs sont convertibles en int type, avec true convertissant en 1 et false convertir en 0. Ceci est garanti par la langue.

P.S. Le langage C a aussi un type booléen dédié _Bool (alias macro comme bool), et ses règles de conversion intégrales sont essentiellement les mêmes qu'en C++. Néanmoins, cela n’est néanmoins pas pertinent pour vos exemples spécifiques en C. Une fois encore, les opérateurs relationnels en C produisent toujours des résultats int (et non bool) quelle que soit la version de la spécification de langue.

46
AnT

La section 6.5.8.6 de la norme C dit:

Chacun des opérateurs <(inférieur à),> (supérieur à), <= (inférieur ou égal à) et> = (supérieur ou égal à) doit donner 1 si la relation spécifiée est vraie et 0 si elle est false.) Le résultat est de type int.

17
user97370

Il ne semble y avoir aucun problème puisque la distribution int pour bool est faite implicitement. Cela fonctionne dans les compilateurs Microsoft Visual C++, GCC et Intel C++. Pas de problème en C ou C++.

2
Alex James