Mejor respuesta
Suponiendo que quiere sizeof (E), donde E es un tipo de enumeración:
Depende en el tipo subyacente. Normalmente es int, pero si usa enum class
, puede especificarlo en C ++. De cualquier manera, sizeof debería dar el valor correcto.
No existe una forma estándar o incorporada para determinar el número de enumerands en C o C ++. Si es disciplinado y no tiene lagunas, puede usar algo como esto: cada enumerador excepto el primero debe ser uno más alto que su predecesor:
enum Days { Monday, Tuesday, … Saturday, LAST };
Aquí, el número de días es el mismo que el valor int de LAST, pero por supuesto debe asegurarse de que LAST sea el último. El compilador no puede hacer cumplir esto.
Si no comienza en cero, pero por alguna razón comienza en, digamos, 7, puede calcular LAST – Monday:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Aquí, también asegúrese de que El lunes se queda primero .
Respuesta
Una enumeración (abreviatura de enumeración ) es una técnica para agregar algún tipo de significado a los números. Las computadoras están limitadas a trabajar solo en números, y las enumeraciones nos permiten pretender que esos números describen una calidad, en lugar de una cantidad.
Una de las enumeraciones más famosas es la codificación que usamos para almacenar texto. La idea es asignar un número a cada una de nuestras letras, de forma muy similar a como un libro para niños escribirá un código numérico. El código que usamos se parece a esto:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Si estás en una máquina con Windows, prueba esto: haz clic en algún lugar donde puedas escribir texto. Mantén presionada la tecla ALT y mientras la mantiene presionada, escriba uno de estos números en el teclado numérico. Por ejemplo, [Presione y mantenga presionada la tecla Alt] 65 [Suelte Alt]. Aparecerá la letra A; este es un método realmente antiguo para ingresar caracteres directamente su código numérico. Es muy útil para escribir caracteres internacionales cuando no tienes instalado el teclado correcto: Çüéâäàåçê … son lo que obtengo de Alt + 128, 129, 130, etc. Esta es una forma de exponer la enumeración subyacente de caracteres.
No hay nada mágico en haber elegido el número 65 para significar A; lo único que importa es que seamos coherentes. Una enumeración, entonces, es un método para asignar números a ideas no numéricas y hacer que el código sea un poco más fácil de trabajar.
Eso sí, Es útil que el orden de los caracteres coincida con el orden alfabético (al menos en inglés). Esto hace que sea más fácil escribir ordenaciones de cadenas que clasifiquen las cosas en orden alfabético, porque puede hacer trampa y usar comparaciones en el valor numérico. Se vuelve un poco más complicado en otros idiomas, porque los valores numéricos asignados a los caracteres no siempre coinciden con el orden alfabético.
Para otro ejemplo de enumeración, supongamos que estamos escribiendo un programa para tratar con conexiones de red. Las conexiones de red pueden tener algunos estados diferentes; pueden estar escuchando , abierto , cerrado o en un estado de error . Estas son cualidades, no cantidades, y para eso es una enumeración:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
En mi opinión, normalmente es una mejor práctica incrustar sus enumeraciones dentro de una definición de clase. Eso le permite omitir los prefijos:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
El tipo es Connection::State
y los valores son Connection::LISTEN
, Connection::OPEN
, etc. Creo que esto es más claro.
Su ejemplo de mezcla de valores numéricos y valores de enumeración no » No tiene sentido; todos los valores enumerados deben comenzar con una letra. Por lo general, no se puede usar un número donde se espera una enumeración; Los compiladores de C ++ tratan ints y enums como tipos diferentes. No está prohibido tener números significativos asociados con los valores de enumeración (tenga en cuenta lo útil que es para el orden alfabético), pero no es la práctica predeterminada.
¿Puede generar o ingresar una enumeración? Seguro que puede , pero como es un tipo personalizado, necesitará escribir sus propios operadores >> y