Ai vecchi tempi di C, non esisteva un tipo booleano. Le persone hanno utilizzato int
per l'archiviazione dei dati booleani e ha funzionato principalmente. Zero era falso e tutto il resto era vero.
Questo significa che se hai preso un int flag = 0;
e più tardi ha fatto flag++
il valore sarebbe vero. Questo funzionerebbe a prescindere dal valore del flag (a meno che non lo abbiate fatto molto, si è verificato il rollover e si è tornati a zero, ma si ignora che) - incrementando la bandiera quando il suo valore era 1 avrebbe dato 2, il che era ancora vero.
Alcune persone lo usavano per impostare incondizionatamente un valore booleano su true. Non sono sicuro che sia mai diventato idiomatic , ma è in qualche codice.
Questo non ha mai funzionato con --
, perché se il valore era diverso da 1 (che potrebbe essere), il valore non sarebbe ancora falso. E se era già falso ( 0
) e su di esso hai fatto un operatore di decremento, non sarebbe rimasto falso.
Quando si spostava codice da C a C ++ nei primi tempi, era molto importante che il codice C incluso in C ++ fosse ancora in grado di funzionare. E così nella specifica per C ++ (sezione 5.2.6 (si veda a pagina 71)) si legge:
The value obtained by applying a postfix ++ is the value that the operand had before applying the operator. [Note: the value obtained is a copy of the original value ] The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a complete object type. After the result is noted, the value of the object is modified by adding 1 to it, unless the object is of type bool
, in which case it is set to true. [Note: this use is deprecated, see annex D. ]
The operand of postfix -- is decremented analogously to the postfix ++ operator, except that the operand shall not be of type bool
.
Questo è nuovamente menzionato nella sezione 5.3.2 (per l'operatore prefisso - 5.2.6 era su postfix)
Come puoi vedere, questo è deprecato (allegato D nel documento, pagina 709) e non dovrebbe essere usato.
Ma questo è il motivo. E a volte potresti vedere il codice. Ma non farlo.