Tuvimos una tarea para nuestra clase donde tuvimos que crear un juego de tres en raya . A la gente le gusta complicarse, así que escribieron juegos complejos que incluían menús. Al final del juego, tenías que tener la opción de volver a jugar o salir del programa. int
Usé una variable para eso, pero noté que algunos compañeros de clase usaban BOOL.
¿Es más eficiente? ¿Cuál es la diferencia entre almacenar una respuesta que solo debería almacenar dos valores en int
lugar de almacenarla en un bool? ¿Cuál es el propósito exacto de estas variables?
int
es almacenar un número entero y el propósito de abool
es almacenar un valor booleano (true
ofalse
). Usar unbool
IMO refleja su uso mucho mejor que usar unint
.typedef int Bool
hacían a menudo para dejar en claro que estaban usando un booleano. Compatibilidad integrada con C ++bool
en el lenguaje, al igual que C99 con la_Bool
palabra clave (bastante fea) .bool
", se trata de por qué tenemos diferentes nombres para tipos similares (comolength_t
) y por qué es importante que el compilador verifique los tipos.Respuestas:
Al elegir tipos de variables y nombres de variables, desea que su intención sea lo más clara posible. Si elige un tipo
bool
(booleano), está claro que solo hay dos valores aceptables:true
ofalse
. Si usa un tipoint
(entero), ya no está claro que la intención de esa variable solo puede ser 1 o 0 o cualquier valor que elija significartrue
yfalse
. Plussizeof(int)
normalmente devolverá como 4 bytes, mientrassizeof(bool)
que devolverá 1.fuente
Al parecer, en todos los (hasta ahora) recogidos respuestas nadie captó el hecho de que el OP habló sobre
BOOL
nobool
.Dado que la pregunta está etiquetada como C ++, debe tenerse en cuenta que:
int
es un número entero que varía deINT_MIN
aINT_MAX
- macros definidos en<climits>
cuyos valores dependen de la arquitectura de la máquina de alojamiento. En C ++ estos valores también son accesibles comostd::numeric_limits<int>::min()
y...:max()
respectivamente). El comportamiento de los operadores booleanos se aplica paraint
tratar0
como falso y todo lo demás como verdadero .BOOL
es solo una pista que sugiere un comportamiento booleano para un int. Se define<cstddef>
comoBOOL
no es más que azúcar sintáctica, por lo que, según el compilador, no es más que un int. Es algo que usan los programadores de C, pero los programadores de C ++ deben evitarlo, ya que C ++ lo ha hechobool
.bool
es un tipo integral de lenguaje cuyos valores admitidos son justtrue
yfalse
. Cuando se convierte en seint
true
convierte en 1 y sefalse
convierte en 0.El aspecto importante es que es más seguro contra errores de programación:
es imposible codificar con el tipo de bool apropiado:
Usar en
BOOL
lugar debool
es solo un mal hábito heredado de un pasado glorioso que nadie puede olvidar, creando así un viejo problema para un mañana menos glorioso.¡Los profesores de idiomas deberían pensarlo seriamente!
fuente
Los tipos de bool son más pequeños que los tipos Int, por lo tanto, utilizan menos espacio en la memoria. Dependiendo del sistema en el que esté compilando, un Int puede tener de 4 a 8 bytes, mientras que un Bool es de 1 byte (como se puede ver en este artículo de MSDN )
Combine esto con algunos de los aspectos de KISS y el buen diseño del programa, y se hace evidente por qué es mejor usar un bool para almacenar una variable que solo tendrá 2 valores.
¿Por qué complicar más las cosas con un objeto que puede almacenar una amplia gama de valores, cuando está seguro de que solo necesita almacenar 1 de 2 valores diferentes?
¿Qué sucede en el sistema que usa un int, si almacena 75 allí? Si ha agregado condicionales adicionales
o
entonces estás cubierto para esta situación. Pero si no lo has hecho, entonces no lo estás.
También podría tener un caso (dependiendo de cómo esté cambiando el valor de int) donde tiene un desbordamiento de búfer, y el valor "se restablece" de nuevo a 0 o el límite inferior de su int (que podría estar en algún lugar del región de -127 a −9,223,372,036,854,775,808, dependiendo de su arquitectura de destino ) ¿qué sucede en su código entonces?
Sin embargo, si usaste un bool, podrías usar algo como esto:
O incluso:
o incluso:
Dependiendo de su compilador, puede haber optimizaciones que se puede realizar en el código que utiliza para almacenar Bools asignan valores de verdadero / falso. Considerando que, tal vez no haya optimizaciones que se pueden realizar con Entrs utilizado para almacenar los valores verdadero / falso asignadas.
También debemos recordar que C ++ (junto con C, Assembly y FORTRAN) se usa para escribir código altamente eficiente, pequeño y rápido. Por lo tanto, sería mejor usar un Bool en este caso, especialmente si está marcado por el uso de variables, memoria, caché o tiempo de procesador.
Una pregunta similar sería: ¿por qué almacenaría un entero (valor) en un flotante? Respuesta: No deberías, porque no tiene sentido.
Larga historia corta: como su maestro / tutor / conferenciante / profesor para repasar los tamaños de los diferentes tipos de valor con usted (en caso de que se lo haya perdido) y por qué son importantes en el Desarrollo de software.
Espero que ayude como punto de partida (también espero que no parezca pedante)
fuente
return value >= 0;
para el primer ejemplo.El propósito aquí es la claridad de la intención. El tipo de retorno es parte de una interfaz de funciones y un
bool
le dice más sobre qué esperar de la función que un loint
hace.Incluso
BOOL
es más expresivo queint
, aunque es del mismo tipo, al menos muestra tu intención.Sin embargo, ninguno de ellos es lo que recomendaría:
fuente
En programación, quieres representar algo de la vida real en código. A pesar de que int y bool pueden hacer lo mismo, la idea subyacente es completamente diferente: cuando se usa un bool, la respuesta puede ser sí o no; y eso es todo, esa es la intención. Con enteros puede representar cantidades sin punto decimal. Y en ese mismo espíritu, ¿por qué elegirías un número entero cuando un doble puede hacer lo mismo? Si un número entero tiene más sentido que un doble al modelar el problema, entonces puede elegir un int.
fuente
Porque al final, vas a convertir tu número entero a booleano de todos modos: "si (i = 1) entonces juegas otro juego". En esta situación (i = 1) se convierte en verdadero o falso: un booleano.
fuente
if (i = 1)
es probablemente el muy mal que hay que tener en el código de uno.