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à truedopo 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_BITSqualcosa 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 intdovremmo ovviamente usare ++2 ^ 32 volte prima che questo sia un problema. Con --sebbene risulterà solo falsese 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 falsevalore alla fine come in:
int x = -5;
while(++x)
doSomething(x);
Tuttavia, questo esempio tratta xcome un intovunque tranne il condizionale, quindi è equivalente a:
int x = -5;
while(++x != 0)
doSomething(x);
Che è diverso dall'uso solo xcome booleano.