Ele vem da história do uso de valores inteiros como booleanos.
Se x
for 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 true
depois (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_BITS
algo 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 false
se 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 false
valor eventualmente, como em:
int x = -5;
while(++x)
doSomething(x);
No entanto, este exemplo trata x
como um int
todo, exceto o condicional, portanto, é equivalente a:
int x = -5;
while(++x != 0)
doSomething(x);
O que é diferente de usar apenas x
como booleano.