Por que o operador --
não existe para bool, enquanto existe para o operador ++
?
Eu tentei em C ++ e não sei se minha pergunta se aplica a outro idioma. Ficarei feliz em saber também.
Eu sei , posso usar o operador ++
com um bool. Torna qualquer bool igual a true.
bool b = false;
b++;
// Now b == true.
Por que não podemos usar o operador de --
maneira oposta?
bool b = true;
b--;
// Now b == false;
Não é muito útil, mas estou curioso.
Respostas:
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 fizesseflag++
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ê:
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.
fonte
Para lidar parcialmente com o código legado usado
int
ou semelhante ao seu tipo booleano.fonte
Para entender o significado histórico desta questão, você deve considerar o caso do Therac-25. O Therac-25 era um dispositivo médico que transmitia radiação a pacientes com câncer. Foi atormentado por más práticas de programação que contribuíram para seu histórico de segurança insuficiente (com várias mortes atribuídas a ele).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(vá para o final da página 3)
O Therac-25 usava algo como o equivalente a
operator++
em umbool
. No entanto, a linguagem de programação que eles usaram não era C ++ e seu tipo de dados nãobool
. Ao contrário da garantia em C ++, no entanto, um tipo inteiro regular simplesmente continua subindo. O tipo de dados deles era equivalente auint8_t
.O C ++ decidiu manter o ambiente
operator++
para pessoas acostumadas a programar assim, mas, em vez de aumentar o valor, simplesmente o definetrue
para evitar coisas assim.Observe que
operator++(bool)
está obsoleto.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Anexo D de C ++ 14:
fonte
bool
tipo. Eu estava apenas tentando dar um exemplo histórico de quando as pessoas realmente programavam dessa maneira.