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.