Pochodzi z historii używania wartości całkowitych jako wartości logicznych.
Jeśli x
jest int
, ale używam go jako wartości logicznej, zgodnie z if(x)...
tym zwiększanie będzie oznaczało, że niezależnie od jego prawdziwej wartości przed operacją, będzie miała wartość prawdziwości true
po niej (z wyjątkiem przepełnienia).
Jednak niemożliwe jest przewidzenie wyniku --
danej wiedzy tylko o wartości prawdziwości x
, ponieważ może to skutkować false
(jeśli wartość całkowa wynosi 1) lub true
(jeśli wartość całkowa jest czymś innym - w szczególności obejmuje to 0 [ false
] i 2 lub więcej [ true
]).
Więc jak krótka ręka ++
zadziałała i --
nie.
++
jest dozwolone na bools dla zgodności z tym, ale jego użycie jest przestarzałe w standardzie.
Zakłada się, że tylko użyć x
jako wartość logiczną, co oznacza, że przelew nie może się zdarzyć, aż zrobiłem ++
wystarczająco często, aby spowodować przepełnienie na swój własny. Nawet z char jako używanym typem i CHAR_BITS
czymś niskim, jak 5, to 32 razy, zanim to już nie zadziała (to wciąż wystarczający argument, że jest to zła praktyka, nie bronię praktyki, tylko wyjaśniam, dlaczego to działa) w przypadku wersji 32-bitowej int
musielibyśmy oczywiście użyć ++
2 ^ 32 razy, zanim pojawi się problem. Z tym, --
że spowoduje to tylko false
wtedy, gdy zacznę od wartości 1 for true
lub zacznę od 0 i użyłem ++
dokładnie raz wcześniej.
Inaczej jest, jeśli zaczniemy z wartością, która znajduje się zaledwie kilka poniżej 0. Istotnie, w takim przypadku może chcemy ++
, aby doprowadzić do false
wartości takiej, jak w końcu:
int x = -5;
while(++x)
doSomething(x);
Jednak ten przykład traktuje x
jako int
wszędzie oprócz warunku, więc jest równoważny z:
int x = -5;
while(++x != 0)
doSomething(x);
Co różni się od używania tylko x
jako wartości logicznej.