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:
La valeur obtenue en appliquant un suffixe ++ est la valeur que l'opérande avait avant d'appliquer l'opérateur. [Remarque: la valeur obtenue est une copie de la valeur d'origine] L'opérande doit être une valeur l modifiable. Le type de l'opérande doit être un type arithmétique ou un pointeur sur un type d'objet complet. Une fois le résultat noté, la valeur de l'objet est modifiée en y ajoutant 1, sauf si l'objet est de type bool
, auquel cas il est défini sur true. [Remarque: cette utilisation est déconseillée, voir annexe D.]
L'opérande de postfix - est décrémenté de manière analogue à l'opérateur postfix ++, sauf que l'opérande ne doit pas être de type bool
.
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.