Ai vecchi tempi di C, non esisteva un tipo booleano. Le persone lo usavano int
per l'archiviazione di dati booleani e funzionava principalmente. Zero era falso e tutto il resto era vero.
Ciò significava che se avessi preso un int flag = 0;
e in seguito flag++
il valore sarebbe vero. Funzionerebbe indipendentemente dal valore del flag (a meno che non lo facessi molto, si capovolgesse e tornassi a zero, ma lo ignoriamo) - incrementare il flag quando il suo valore era 1 darebbe 2, che era comunque vero.
Alcune persone lo hanno usato per impostare incondizionatamente un valore booleano su true. Non sono sicuro che sia mai diventato idiomatico , ma è in qualche codice.
Questo non ha mai funzionato --
, perché se il valore fosse diverso da 1 (che potrebbe essere), il valore non sarebbe comunque falso. E se fosse già falso ( 0
) e hai fatto un operatore di decremento su di esso, non rimarrebbe falso.
Quando si spostava il 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ì nelle specifiche per C ++ (sezione 5.2.6 (è a pagina 71)) si legge:
Il valore ottenuto applicando un postfix ++ è il valore che l'operando aveva prima di applicare l'operatore. [Nota: il valore ottenuto è una copia del valore originale] L'operando deve essere un valore modificabile. Il tipo di operando deve essere un tipo aritmetico o un puntatore a un tipo di oggetto completo. Dopo aver notato il risultato, il valore dell'oggetto viene modificato aggiungendo 1 ad esso, a meno che l'oggetto non sia di tipo bool
, nel qual caso è impostato su true. [Nota: questo uso è obsoleto, vedere l'allegato D.]
L'operando di postfix - viene decrementato in modo analogo all'operatore postfix ++, tranne per il fatto che l'operando non deve essere di tipo bool
.
Questo è di nuovo menzionato nella sezione 5.3.2 (per l'operatore prefisso - 5.2.6 era su postfix)
Come puoi vedere, questo è obsoleto (allegato D nel documento, pagina 709) e non dovrebbe essere usato.
Ma ecco perché. E a volte potresti vedere il codice. Ma non farlo.