¿Por qué el operador --
no existe para bool mientras que sí existe para el operador ++
?
Lo intenté en C ++, y no sé si mi pregunta se aplica a otro idioma. Estaré encantado de saber también.
Lo sé , puedo usar el operador ++
con un bool. Hace que cualquier bool sea igual a verdadero.
bool b = false;
b++;
// Now b == true.
¿Por qué no podemos usar el operador --
de manera opuesta?
bool b = true;
b--;
// Now b == false;
No es muy útil, pero tengo curiosidad.
Respuestas:
En los viejos tiempos de C, no había tipo booleano. La gente usaba el
int
para almacenar datos booleanos, y funcionaba principalmente. Zero era falso y todo lo demás era cierto.Esto significaba que si tomabas
int flag = 0;
y luego lo hacías ,flag++
el valor sería verdadero. Esto funcionaría sin importar cuál fuera el valor de la marca (a menos que lo hicieras mucho, se volcó y volviste a cero, pero ignoremos eso) : el incremento de la bandera cuando su valor era 1 daría 2, que todavía era cierto.Algunas personas usaron esto para establecer incondicionalmente un valor booleano en verdadero. No estoy seguro de que alguna vez se haya vuelto idiomático , pero está en algún código.
Esto nunca funcionó
--
, porque si el valor fuera distinto de 1 (que podría ser), el valor aún no sería falso. Y si ya era falso (0
) e hiciste un operador de decremento, no sería falso.Al mover el código de C a C ++ en los primeros días, era muy importante que el código C incluido en C ++ todavía pudiera funcionar. Y así, en la especificación para C ++ (sección 5.2.6 (está en la página 71)) se lee:
Esto se menciona nuevamente en la sección 5.3.2 (para el operador de prefijo - 5.2.6 estaba en postfix)
Como puede ver, esto está en desuso (Anexo D en el documento, página 709) y no debe usarse.
Pero por eso. Y a veces puedes ver el código. Pero no lo hagas.
fuente
Para hacer frente parcialmente al código heredado que usaba
int
o similar como su tipo booleano.fuente
Para comprender el significado histórico de esta pregunta, debe considerar el caso de Therac-25. El Therac-25 era un dispositivo médico que administraba radiación a pacientes con cáncer. Estaba plagado de malas prácticas de programación que contribuyeron a su pobre historial de seguridad (con múltiples muertes atribuidas).
http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html
(vaya al final de la página 3)
Therac-25 usó algo como el equivalente de
operator++
en abool
. Sin embargo, el lenguaje de programación que usaron no era C ++, y su tipo de datos no lo erabool
. Sin embargo, a diferencia de la garantía en C ++, un tipo entero normal simplemente sigue subiendo. Su tipo de datos era el equivalente deuint8_t
.C ++ decidió mantener el
operator++
margen para las personas acostumbradas a programar de esta manera, pero en lugar de aumentar el valor, simplemente lo configuratrue
para evitar cosas como esta.Tenga en cuenta que
operator++(bool)
está en desuso.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf
Anexo D de C ++ 14:
fuente
bool
tipo. Solo estaba tratando de dar un ejemplo histórico de cuándo las personas realmente programaban de esta manera.