Proviene dalla storia dell'utilizzo di valori interi come valori booleani.
Se x
è un int
, ma lo sto usando come booleano, if(x)...
quindi l'incremento significherà che qualunque sia il suo valore di verità prima dell'operazione, avrà un valore di verità true
dopo di esso (salvo overflow).
Tuttavia, è impossibile prevedere il risultato di una --
data conoscenza solo del valore di verità di x
, poiché potrebbe risultare in false
(se il valore integrale è 1) o true
(se il valore integrale è qualcos'altro - in particolare questo include 0 [ false
] e 2 o più [ true
]).
Quindi come una mano corta ha ++
funzionato, e --
non l'ha fatto.
++
è consentito su bool per compatibilità con questo, ma il suo uso è deprecato nello standard.
Ciò presuppone che io usi solox
come booleano, il che significa che l'overflow non può verificarsi fino a quando non l'ho fatto ++
abbastanza spesso da causare un overflow da solo. Anche con char come tipo usato e CHAR_BITS
qualcosa di basso come 5, è 32 volte prima che questo non funzioni più (è ancora un argomento sufficiente perché è una cattiva pratica, non sto difendendo la pratica, spiegando solo perché funziona) per un 32 bit int
dovremmo ovviamente usare ++
2 ^ 32 volte prima che questo sia un problema. Con --
sebbene risulterà solo false
se ho iniziato con un valore di 1 per true
, o se ho iniziato con 0 e usato ++
esattamente una volta prima.
Questo è diverso se iniziamo con un valore che è solo alcuni sotto lo 0. In effetti, in tal caso potremmo voler ++
restituire il false
valore alla fine come in:
int x = -5;
while(++x)
doSomething(x);
Tuttavia, questo esempio tratta x
come un int
ovunque tranne il condizionale, quindi è equivalente a:
int x = -5;
while(++x != 0)
doSomething(x);
Che è diverso dall'uso solo x
come booleano.