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.
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 valeurtrue
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ère1
,false
qui se développe à la constante entière0
, [..]
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.
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.
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++.