Pochodzi z historii używania wartości całkowitych jako wartości logicznych.
Jeśli xjest 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 truepo 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ć xjako 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_BITSczymś 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 intmusielibyśmy oczywiście użyć ++2 ^ 32 razy, zanim pojawi się problem. Z tym, --że spowoduje to tylko falsewtedy, gdy zacznę od wartości 1 for truelub 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 falsewartości takiej, jak w końcu:
int x = -5;
while(++x)
doSomething(x);
Jednak ten przykład traktuje xjako intwszę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 xjako wartości logicznej.