Pourquoi l'opérateur n'existe-t-il --
pas pour bool alors qu'il existe pour opérateur ++
?
J'ai essayé en C ++, et je ne sais pas si ma question s'applique à une autre langue. Je serai content de le savoir aussi.
Je sais , je peux utiliser l'opérateur ++
avec un bool. Cela rend tout bool égal à vrai.
bool b = false;
b++;
// Now b == true.
Pourquoi ne pouvons-nous pas utiliser l'opérateur --
de manière opposée?
bool b = true;
b--;
// Now b == false;
Ce n'est pas très utile, mais je suis curieux.
Réponses:
Dans l'ancien temps de C, il n'y avait pas de type booléen. Les gens ont utilisé le
int
pour stocker des données booléennes, et cela a fonctionné principalement. Zéro était faux et tout le reste était vrai.Cela signifiait que si vous en preniez un
int flag = 0;
et plus tard,flag++
la valeur serait vraie. Cela fonctionnerait quelle que soit la valeur de l'indicateur (à moins que vous ne le fassiez beaucoup, il roulait et que vous reveniez à zéro, mais ignorons cela) - incrémenter l'indicateur lorsque sa valeur était 1 donnerait 2, ce qui était toujours vrai.Certaines personnes l'ont utilisé pour définir inconditionnellement une valeur booléenne sur true. Je ne suis pas sûr que cela soit devenu idiomatique , mais c'est dans un certain code.
Cela n'a jamais fonctionné
--
, car si la valeur était autre que 1 (ce qu'elle pourrait être), la valeur ne serait toujours pas fausse. Et si c'était déjà false (0
) et que vous avez fait un opérateur de décrémentation dessus, cela ne resterait pas faux.Lors du déplacement de code de C vers C ++ dans les premiers jours, il était très important que le code C inclus dans C ++ puisse toujours fonctionner. Et donc dans la spécification pour C ++ (section 5.2.6 (c'est à la page 71)), il lit:
Ceci est à nouveau mentionné dans la section 5.3.2 (pour l'opérateur de préfixe - 5.2.6 était sur postfix)
Comme vous pouvez le voir, cela est obsolète (Annexe D dans le document, page 709) et ne doit pas être utilisé.
Mais c'est pourquoi. Et parfois, vous pouvez voir le code. Mais ne le fais pas.
la source
Pour gérer partiellement le code hérité utilisé
int
ou similaire comme type booléen.la source
Pour comprendre la signification historique de cette question, vous devez considérer le cas du Therac-25. Le Therac-25 était un appareil médical qui délivrait des radiations aux patients cancéreux. Il était en proie à de mauvaises pratiques de programmation qui ont contribué à son mauvais bilan de sécurité (avec plusieurs décès qui lui sont attribués).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(allez au bas de la page 3)
Le Therac-25 a utilisé quelque chose comme l'équivalent d'
operator++
unbool
. Cependant, le langage de programmation qu'ils utilisaient n'était pas C ++, et leur type de données ne l'était pasbool
. Contrairement à la garantie en C ++, cependant, un type entier régulier continue de monter. Leur type de données était l'équivalent deuint8_t
.C ++ a décidé de garder le
operator++
contact pour les gens habitués à programmer comme ça, mais au lieu d'incrémenter la valeur, il le définit simplementtrue
pour empêcher des choses comme ça.Notez que
operator++(bool)
c'est obsolète.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Annexe D de C ++ 14:
la source
bool
type. J'essayais juste de donner un exemple historique du moment où les gens ont réellement programmé de cette façon.