106 votes

bool operator ++ et--

Aujourd'hui, lors de l’écriture du code Visual C++, je suis tombé sur quelque chose qui m’a surpris. Il semble prise en charge C++ ++ (incrément) pour booléen, mais pas--(décrémentation). C’est ce juste une décision aléatoire, ou il y a une raison derrière tout cela ?

Cette compile :

Cela ne veut pas :

93voto

Jon Hanna Points 40291

Il s'agit de l'histoire de l'utilisation de valeurs de type entier comme des booléens.

Si x est int, mais je l'utilise comme une valeur booléenne que par if(x)... puis incrémentation signifie que, quelle que soit sa valeur de vérité avant l'opération, il aura une valeur de vérité d' true après (sauf dépassement de capacité).

Cependant, il est impossible de prédire le résultat d' -- compte tenu de la connaissance seulement de la valeur de vérité x,, car il pourrait en false (si l'intégrale est égale à 1) ou true (si la valeur intégrale est rien d'autre - notamment ceci inclut 0 [false] et 2 [true]).

Donc, comme un court-part ++ a travaillé, et -- n'ont pas.

++ est autorisée sur les booléens pour la compatibilité avec cela, mais son utilisation est déconseillée dans la norme.


Cela suppose que j'ai seulement utiliser x comme un booléen, ce qui signifie que le débordement ne peut pas se produire jusqu'à ce que j'ai fait ++ assez souvent à cause d'un débordement sur son propre. Même avec un char comme le type et CHAR_BITS quelque chose faibles comme 5, c'est 32 fois avant que cela ne fonctionne plus (c'est encore un argument suffisant pour qu'il soit une mauvaise pratique, je ne suis pas la défense de la pratique, tout en expliquant pourquoi il fonctionne) pour un 32 bits int bien entendu, nous aurions dû utiliser ++ 2^32 fois avant que ce soit un problème. Avec -- bien qu'il ne fait qu' false si j'ai commencé avec une valeur de 1 true, ou a commencé avec 0 et utilisé ++ précisément une fois avant.

C'est différent si on commence avec une valeur qui est juste un peu en dessous de 0. En effet, dans un tel cas, nous pourrions vouloir ++ de résultat en false de la valeur finalement, comme dans:

int x = -5;
while(++x)
  doSomething(x);

Cependant, cet exemple traite x comme int partout, sauf au conditionnel, il est donc équivalente à:

int x = -5;
while(++x != 0)
  doSomething(x);

Ce qui est différent à l'utilisation d' x comme une valeur booléenne.

29voto

Nordic Mainframe Points 13717

ANSI ISO IEC 14882 2003 (c++03):

5.2.6-2

L'opérande de postfix-est décrémenté de façon analogue à la postfix ++ opérateur, sauf que l'opérande doit pas être de type bool. [Note: Pour préfixe d'incrémentation et de décrémentation, voir 5.3.2. ]

Et sans surprise...

5.3.2-2

L'opérande de préfixe -- est modifié en soustrayant 1. L'opérande est ne pas être de type bool. Les exigences sur l'opérande de préfixe -- et l' propriétés de son résultat sont autrement les mêmes que ceux de préfixe ++. [Note: Pour postfix d'incrémentation et de décrémentation, voir 5.2.6. ]

Aussi la 5.6.2-1 et 5.3.2-1 mentionner que ++ pour les booléens doivent être véridiques et à l'Annexe D-1 dit que ++ sur les booléens dans obsolète.

9voto

Abhay Points 4268

Pour des raisons historiques ceci a été pris en charge. Mais notez que ... L'utilisation d'un opérande de type bool avec l'opérateur ++ est obsolète, voir la Section 5.3.2 de la Norme C++ (n3092)

5.3.2 d'Incrémentation et de décrémentation [expr.pré.incr]

  • L'opérande de préfixe ++ est modifié en ajoutant 1, ou la valeur true si elle est bool (cette utilisation est déconseillée). L' l'opérande doit être modifiable lvalue. Le type de l'opérande doit être une l'arithmétique de type ou un pointeur vers un complètement définie par type d'objet. L' le résultat est la mise à jour de l'opérande; il est une lvalue, et c'est un peu de champ si l'opérande est un peu de champ. Si x est pas de type booléen, l'expression ++x est équivalent à x+=1 [ Note: voir la les discussions de l'addition (5.7) et opérateurs d'affectation (5.17) pour informations sur les conversions. -la note de fin de ]
  • L'opérande de préfixe -- est modifié en soustrayant 1. L'opérande est ne pas être de type bool. Les exigences sur l'opérande de préfixe -- et l' propriétés de son résultat sont sinon, les mêmes que ceux de préfixe ++.

2voto

Martin Beckett Points 60406

C'est une fonctionnalité délibérée ( http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx )

Je soupçonne que beaucoup de code MS utilise quelque part bool ++ pour forcer true (depuis l'époque où bool était un int) et qu'il était plus facile de patcher le compilateur que le code.

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