Ele vem da história do uso de valores inteiros como booleanos.
Se xfor um int, mas estou usando-o como um booleano, if(x)...então incrementar significará que qualquer que seja o seu valor verdade antes da operação, terá um valor verdade truedepois (barrando o estouro).
No entanto, é impossível prever o resultado de --determinado conhecimento apenas do valor de verdade de x, já que poderia resultar em false(se o valor integral for 1) ou true(se o valor integral for qualquer outra coisa - notavelmente isso inclui 0 [ false] e 2 ou mais [ true]).
Então, como um atalho ++funcionou, e --não funcionou .
++ é permitido em bools para compatibilidade com isso, mas seu uso está obsoleto no padrão.
Isso pressupõe que eu use apenasx como booleano, o que significa que o estouro não pode acontecer até que eu tenha feito o ++suficiente para causar um estouro por conta própria. Mesmo com char como o tipo usado e CHAR_BITSalgo baixo como 5, isso é 32 vezes antes que isso não funcione mais (isso ainda é um argumento suficiente para ser uma prática ruim, não estou defendendo a prática, apenas explicando por que funciona) para 32 bits, inté claro que teríamos de usar ++2 ^ 32 vezes antes que isso fosse um problema. Com --embora, ele só resultará em falsese eu começar com um valor de 1 para true, ou começar com 0 e usar ++precisamente uma vez antes.
Isso é diferente se começarmos com um valor que é apenas alguns abaixo de 0. Na verdade, nesse caso, podemos querer ++resultar no falsevalor eventualmente, como em:
int x = -5;
while(++x)
doSomething(x);
No entanto, este exemplo trata xcomo um inttodo, exceto o condicional, portanto, é equivalente a:
int x = -5;
while(++x != 0)
doSomething(x);
O que é diferente de usar apenas xcomo booleano.