Nos velhos tempos de C, não havia tipo booleano. As pessoas usavam o int
arquivo para armazenar dados booleanos, e eles funcionavam principalmente. Zero era falso e tudo o mais era verdade.
Isso significava que se você fizesse uma int flag = 0;
e depois fizesse flag++
o valor seria verdadeiro. Isso funcionaria independentemente do valor do sinalizador (a menos que você o fizesse muito, ele rolou e você voltou a zero, mas vamos ignorá-lo) - incrementar o sinalizador quando seu valor era 1 daria 2, o que ainda era verdade.
Algumas pessoas usaram isso para definir incondicionalmente um valor booleano como true. Não tenho certeza se alguma vez se tornou idiomático , mas está em algum código.
Isso nunca funcionou --
, porque se o valor fosse diferente de 1 (o que poderia ser), o valor ainda não seria falso. E se já era false ( 0
) e você fez um operador de decréscimo, não permaneceria falso.
Ao mover o código de C para C ++ nos primeiros dias, era muito importante que o código C incluído no C ++ ainda pudesse funcionar. E assim, na especificação para C ++ (seção 5.2.6 (na página 71)), ele lê:
O valor obtido pela aplicação de um postfix ++ é o valor que o operando possuía antes de aplicar o operador. [Nota: o valor obtido é uma cópia do valor original] O operando deve ser um valor modificável. O tipo do operando deve ser um tipo aritmético ou um ponteiro para um tipo de objeto completo. Depois que o resultado é observado, o valor do objeto é modificado adicionando 1 a ele, a menos que o objeto seja do tipo e bool
, nesse caso, seja definido como true. [Nota: esse uso foi descontinuado, consulte o anexo D.]
O operando do postfix - é decrementado de forma análoga ao operador postfix ++, exceto que o operando não deve ser do tipo bool
.
Isso é mencionado novamente na seção 5.3.2 (para o operador de prefixo - o 5.2.6 estava no postfix)
Como você pode ver, isso foi preterido (anexo D no documento, página 709) e não deve ser usado.
Mas é por isso. E às vezes você pode ver o código. Mas não faça isso.