Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: candidatopardo en 18 de Febrero 2016, 08:01
-
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?
-
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!