178 votes

bool int conversion

Comment portable est cette conversion. Puis-je être sûr que ces deux affirmations?

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

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

Ne me demandez pas pourquoi. Je sais que c'est laid. Je vous remercie.

270voto

Nawaz Points 148870
int x = 4<5;

Totalement portable. Standard conforme. bool de int conversion est implicite!

§4.7/4 de la Norme C++ dit (partie Intégrante de Conversion)

Si la source est de type bool, la valeur false est converti à zéroet la valeur true , est converti en un.


Comme pour C, autant que je sache, il n'y a pas d' bool chez C. (avant 1999) Alors bool de int de conversion est pertinente en C++. En C, 4<5 évalue int de la valeur, dans ce cas, la valeur est 1, 4>5 permettrait d'évaluer à l' 0.

EDIT: Jens dans le commentaire dit, C99 a _Bool type. bool est une macro définie en stdbool.h fichier d'en-tête. true et false sont également macro définie en stdbool.h.

§7.16 de C99 dit,

La macro bool étend à _Bool.

[..] true qui s'étend de la constante entière 1, false qui s'étend de la constante entière 0,[..]

62voto

AndreyT Points 139512

Vous tagged votre question [C] et [C++] dans le même temps. Les résultats seront cohérentes entre les langues, mais la structure de l', la réponse est différente pour chacune de ces langues.

En langage C, et vos exemples n'a pas de rapport à bool que ce soit (qui s'applique à C99). En langage C, les opérateurs relationnels ne produisent pas d' bool des résultats. Les deux 4 > 5 et 4 < 5 sont des expressions qui produisent des résultats de type int avec des valeurs 0 ou 1. Donc, il n'y a pas de "bool int conversion" de toute sorte de prendre place dans votre exemple en C.

En C++ opérateurs relationnels ne sont en effet produire de l' bool des résultats. bool des valeurs sont convertibles int type true de la conversion à l' 1 et false de la conversion à l' 0. Cela est garanti par la langue.

P. S. C aussi la langue possède un type booléen _Bool (macro-alias bool), et son intégrale des règles de conversion sont essentiellement les mêmes qu'en C++. Mais néanmoins, ce n'est pas pertinente pour votre exemples précis dans C. une Fois de plus, les opérateurs relationnels dans C toujours produire de l' int (pas bool) résultats, indépendamment de la version de la spécification du langage.

3voto

Alex James Points 126

Il semble y avoir aucun problème depuis l'int bool casting est fait implicitement. Ce qui fonctionne dans Microsoft Visual C++, GCC et Intel C++ compiler. Pas de problème en C ou C++.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X