34 votes

Quelles sont toutes les valeurs possibles d'une valeur bool en C ++?

La question n'est pas si évident que cela paraisse, et j'ai du mal à trouver beaucoup d'informations sur l' bool type de la norme.

Selon le C++11 standard, quelles sont les garanties associées à l' bool type en ce qui concerne:

  • De stockage: de combien d'espace faut-il, ignorant l'alignement? Est-il nécessaire pour la valeur qui sera stockée pour représenter trueet false?
  • Les valeurs prises: Laissez - b être de type bool, ne l'assertion (b == true) || (b == false) - il contenir? Est - (false < true) bien formé, et tient-il?

42voto

R. Martinho Fernandes Points 96873

bool types sont décrits dans la section §3.9.1, types Fondamentaux. De l'intérêt ici c'est une phrase de l'alinéa 6:

Les valeurs de type bool sont soit true ou false.47

La référence de la note de bas de page 47 offre d'intéressants renseignements supplémentaires:

47) à l'Aide d'un bool de la valeur dans le sens décrit par la présente Norme Internationale comme "undefined", tels que par l'examen de la valeur d'un non initialisée automatique d'objets, peut pousser à se comporter comme si elle n'est ni true ni false.

C'est juste une conséquence directe de la norme imposant pas d'exigences sur les programmes avec un comportement indéterminé.

Il n'existe pas de conditions relatives à la taille sur bool, autres que l'implicite "au moins un octet" qui s'applique à tous les types comme une conséquence de la C++ modèle de mémoire.

Il y a également pas d'exigences sur la représentation interne d' bool objets, cependant, en raison des exigences concernant l'intégrale des conversions (true doit convertir 1 et false de 0), les implémentations peuvent être enclins à choisir les mêmes observations pour true et 1, et pour false et 0, depuis qui rend de telles conversions inutiles.

25voto

Mike Seymour Points 130519

De stockage: de combien d'espace faut-il, ignorant l'alignement?

La mise en œuvre définis, mais dans la pratique, un octet. Il peut généralement pas être plus petite, puisque c'est le plus possible la taille de l'objet. Les Exceptions sont les suivantes:

  • champ de bits membres de la classe peuvent être un peu unique;
  • std::vector<bool> packs de valeurs, de sorte que chacun prend un peu; mais ne pas vraiment tenir des objets de type bool. D'autres types (comme std::bitset) faire des choses similaires, mais ne prétends pas être stocker bool.

Est-il nécessaire pour la valeur qui sera stockée pour représenter true et false?

Non, juste à la condition que, lors de la conversion d'un type numérique, true devient 1 et false devient 0. Dans la pratique, cela signifie qu'une mise en œuvre est susceptible d'utiliser ces valeurs, bien que, sur certaines plates-formes, d'autres représentations qui pourrait fonctionner mieux.

Les valeurs prises: Laissez - b être un objet de type bool, ne l'assertion (b == true) || (b == false) - il contenir?

L'assertion se tenir si b a été initialisée ou attribué une valeur valide. Si c'est non initialisée, alors il ne peut pas tenir, mais vous n'avez pas défini le comportement de toute façon, si vous utilisez une valeur non initialisée. En fait, la norme comprend une note de bas de page (voir les références en C++11 3.9.1/6) avertissement à ce sujet:

47) en Utilisant une valeur booléenne dans le sens décrit par la présente Norme Internationale comme "undefined", tels que par l'examen de la valeur d'un non initialisée automatique d'objets, peut pousser à se comporter comme si il n'est ni vrai ni faux.

Mise à JOUR: la question ne cesse de croître:

Est - (false < true) bien formé, et tient-il?

Oui, et oui. Les opérandes sont promues int, donner des 0 < 1, ce qui est vrai.

7voto

Shafik Yaghmour Points 42198

Par rapport à la taille de l' bool si l'on regarde la section 5.3.3 Sizeof à partir de l'ébauche de la norme C++ il est dit(c'est moi qui souligne):

[...]sizeof(char), sizeof(char signé) et sizeof(unsigned char) sont 1. Le résultat de sizeof appliquer à tout autre type fondamental (3.9.1) est mise en œuvre définies. [ Note: en particulier, sizeof(bool), sizeof(char16_t), sizeof(char32_t) et sizeof(wchar_t) sont définis par l'implémentation.74 -la note de fin ] [...]

et à l'égard des valeurs de bool si l'on regarde la section 3.9.1 types Fondamentaux paragraphe 6 dit:

Les valeurs de type bool sont vraies ou fausses.47

Vous m'avez également demandé:

Les valeurs prises: soit b un objet de type bool, l'assertion (b == true) || (b == false) tenir? Est (false < true) bien formé, et tient-il?

section 4.5 Intégrale des promotions est dit dans le paragraphe 6:

Un prvalue de type booléen peut être converti en prvalue de type int, avec de faux en devenant zéro et devenir un vrai.

Depuis des opérandes < sont promues int alors (false < true) détient en supposant qu' b est correctement initialisé(vous n'êtes pas en invoquant un comportement indéfini) alors (b == true) || (b == false) détient également.

6voto

Sebastian Redl Points 18816

Il existe deux valeurs possibles: true et false .

Tout ce que vous pouvez observer est le résultat d'un comportement indéfini.

0voto

William Custode Points 2435

Dans des conditions normales d'utilisation les cas, toutes les valeurs non nulles de données jeté comme un bool est interprété comme vrai, et toutes les valeurs nulles de données jeté comme un booléen false. Un bool doit être d'au moins 1 octet, comme tous les types en C++ doit observer cette qualité.

Mais j'ai été éclairé ici, et tout le monde au-dessus de moi mérite un upvote. Dans un comportement indéfini scénario (comme non initialisée ou des données malformées) bool peut être à la fois vrai et faux en même temps. Un tel comportement étrange, mais encore une fois ce qui est indéfini est toujours étrange. Merci à tous pour l'info.

Dans les commentaires: ce lien vers un autre post.

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