Proviene de la historia del uso de valores enteros como booleanos.
Si x
es an int
, pero lo estoy usando como booleano según, if(x)...
entonces incrementar significará que cualquiera que sea su valor de verdad antes de la operación, tendrá un valor de verdad de true
después de ella (salvo desbordamiento).
Sin embargo, es imposible predecir el resultado de --
un conocimiento dado solo del valor de verdad de x
, ya que podría resultar en false
(si el valor integral es 1) o true
(si el valor integral es cualquier otra cosa, en particular, esto incluye 0 [ false
] y 2 o más [ true
]).
Entonces, como taquigrafía ++
funcionó, y --
no lo hizo.
++
está permitido en bools por compatibilidad con esto, pero su uso está desaprobado en el estándar.
Esto supone que solo lo uso x
como booleano, lo que significa que el desbordamiento no puede ocurrir hasta que lo haya hecho con la ++
frecuencia suficiente para causar un desbordamiento por sí mismo. Incluso con char como el tipo usado y CHAR_BITS
algo bajo como 5, eso es 32 veces antes de que esto ya no funcione (ese sigue siendo un argumento suficiente para que sea una mala práctica, no estoy defendiendo la práctica, solo explicando por qué funciona) para 32 bits int
, por supuesto, tendríamos que usar ++
2 ^ 32 veces antes de que esto sea un problema. Con --
aunque sólo resultará en false
si comenzaba con un valor de 1 para true
, o se inicia con 0 y se utiliza ++
, precisamente, una vez antes.
Esto es diferente si comenzamos con un valor que está solo unos pocos por debajo de 0. De hecho, en tal caso, podríamos querer ++
dar como resultado el false
valor eventualmente, como en:
int x = -5;
while(++x)
doSomething(x);
Sin embargo, este ejemplo se trata x
como en int
todas partes excepto el condicional, por lo que es equivalente a:
int x = -5;
while(++x != 0)
doSomething(x);
Lo cual es diferente a usar solo x
como booleano.