Autor Tema: C++ tipos enumerados enum rangos en que están definidos validez de índices  (Leído 2952 veces)

candidatopardo

  • Visitante
Hace aproximadamente un año compre un libro por amazon que estaba de oferta sobre C++, que me llamo bastante la atención. El libro se llama c++ primer plus, la quinta edición. Hoy tengo entendido que al menos van por la sexta.

El libro da una explicación acerca de los tipos enumerados que es la siguiente:

Originalmente, los únicos valores validos para los tipo enumerado son aquellos nombrados en la declaración:

enum bits {one = 1, two = 2, four = 8, eight = 8}
bits myFlag = bits(6) // Un error segun la explicación que acabo de dar.

Pero c++ ha expandido la lista de valores validos que puedes utilizar a traves del uso de una conversión de tipo (como la que hemos utilizado en la segunda sentencia). Cada enumeración tiene un rango, y tu puedes asignar cualquier entero en el rango.

El rango se define de una manera particular:
  • Para hallar el limite superior, coges el valor del tipo enumerado mas alto (en este caso 8 ). Entonces buscas la potencia de 2 mas baja posible por encima de ese número (en este caso 16) y le restas 1 (quedando el limite superior en 15)
  • Segundo, para encontrar el limite inferior, buscas el valor mas bajo del tipo enumerado (en este caso 0)
    • Si el valor mas bajo es 0 o superior (que lo es) el limite inferior es siempre 0.
    • Si el valor mas bajo es un número negativo (digamos que tenemos un -6) usas el mismo procedimiento que utilizaste para hallar el limite superior, pero en lugar de restar 1, sumas 1.

      Ejemplo: el número mas bajo es -6, la potencia mas grande de 2 por debajo de ese número es -8. Le sumamos 1, quedando en -7 y ahí tenemos el limite inferior.

Según todo este procedimiento bits tiene un rango válido de 0-15



¡Vale! Hasta ahí la explicación y yo creo que se entiende bastante bien. A ver el libro es viejo, no se cuanto pero lo suficiente. Porque yo para hacer pruebas he creado un programa y he hecho algo así.

enum bits {one = 1, two = 2, four = 8, eight = 8}
bits myFlag = bits(59);
bits myFlag2 = bits(-500);

Y el programa no me suelta ningún tipo de error como sería de esperar, después de la explicación que acababa de leer. Lo que si ha hecho es almacenarme los valores bits(59) y bits(-500).

Algo ha cambiado con los tipos enumerado, ¿el que?
« Última modificación: 20 de Febrero 2016, 14:05 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

Tanto en C como en C++ puedes encontrar distintos compiladores y no todos ellos funcionan igual. Aunque pueda parecer extraño, un programa que lanza un error usando un compilador puede compilar y ejecutarse perfectamente en otro sistema. Con esto pueden ocurrir varias cosas. Una es que el compilador tenga detalles distintos a otro compilador, aún usando el mismo estándar del lenguaje. Otro es que el compilador trabaje con distintos estándares del lenguaje. Tanto C como C++ tienen distintas versiones y estándares.

Por otro lado muchos compiladores de estos lenguajes admiten programas donde intuitivamente esperamos que aparezca un error. Por ejemplo si declaras un array de enteros de nombre deporte de 3 elementos, lo esperable, al menos con muchos lenguajes, es que si invocas deporte[12] te salte un error. Sin embargo puedes encontrarte con que el compilador se lo trague y el programa se ejecute.

En esta entrega del curso C se comenta esta situación aparentemente anómala y que debe ser tenida en cuenta http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=901:arrays-unidimensionales-arreglos-o-formaciones-en-c-declaracion-y-limites-indices-ejemplos-cu00512f&catid=82:curso-basico-programacion-lenguaje-c-desde-cero&Itemid=210 

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".