Melhor resposta
Supondo que você queira sizeof (E), onde E é um tipo de enum:
Depende no tipo subjacente. Normalmente isso é int, mas se você usar enum class
, pode especificar isso em C ++. De qualquer maneira, sizeof deve fornecer o valor correto.
Não existe uma maneira padrão ou integrada para determinar o número de enumerandos em C ou C ++. Se você for disciplinado e não tiver lacunas, poderá usar algo assim: todos os enumerand, exceto o primeiro, devem ser um a mais do que seu predecessor:
enum Days { Monday, Tuesday, … Saturday, LAST };
Aqui, o número de dias é igual ao valor int de LAST, mas é claro que você deve garantir que LAST é de fato o último. O compilador não pode impor isso.
Se você não começar do zero, mas por alguma razão começar, digamos, no 7, você pode calcular LAST – Monday:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
Aqui, certifique-se também de que Segunda-feira fica em primeiro lugar .
Resposta
Um enum (abreviação de enumeração ) é uma técnica para adicionar algum tipo de significado aos números. Os computadores estão limitados a trabalhar apenas em números, e as enumerações nos permitem fingir que esses números descrevem uma qualidade, em vez de uma quantidade.
Uma das mais famosas enumerações é a codificação que usamos para armazenar texto. A ideia é atribuir um número a cada uma de nossas letras, da mesma forma que um livro infantil escreveria um código numérico. O código que usamos é semelhante a este:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Se você estiver em uma máquina Windows, tente o seguinte: Clique em algum lugar onde possa digitar o texto. Mantenha pressionado o ALT e, mantendo-a pressionada, digite um desses números no teclado numérico. Por exemplo [Pressione e segure Alt] 65 [Solte Alt]. A letra A aparecerá; este é um método muito antigo para digitar caracteres diretamente por seu código numérico. É mais útil para digitar caracteres internacionais quando você não tem o teclado certo instalado: Çüéâäàåçê … é o que eu obtenho de Alt + 128, 129, 130, etc. Esta é uma maneira de expor a enumeração subjacente de caracteres.
Não há nada de mágico em ter escolhido o número 65 para significar A; a única coisa que importa é que sejamos consistentes. Uma enumeração, então, é um método para atribuir números a ideias não numéricas e tornar o código um pouco mais fácil de trabalhar.
Veja bem, é útil que a ordem dos caracteres corresponda à ordem alfabética (em inglês, pelo menos). Isso torna mais fácil escrever classificações de string que classificam as coisas em ordem alfabética, porque você pode trapacear e usar comparações no valor numérico. Fica um pouco mais complicado em outras linguagens, porque os valores numéricos atribuídos aos caracteres nem sempre correspondem à ordem alfabética.
Para outro exemplo de enum, vamos supor que estejamos escrevendo um programa para lidar com conexões de rede. As conexões de rede podem ter alguns estados diferentes; podem estar ouvindo , abertas , fechado ou em um estado de erro . Estas são qualidades, não quantidades e é para isso que serve um enum:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Na minha opinião, geralmente é uma prática melhor incorporar seus enums dentro de uma definição de classe. Isso permite que você ignore os prefixos:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
O tipo é Connection::State
e os valores são Connection::LISTEN
, Connection::OPEN
, etc. Acho que isso é mais claro.
Seu exemplo de mistura de valores numéricos e valores enum não ” Não faz sentido; todos os valores enumerados devem começar com uma letra. Normalmente, você não pode usar um número onde um enum é esperado; Os compiladores C ++ tratam ints e enums como tipos diferentes. Não é proibido ter números significativos associados a valores enum (observe como é útil para a ordem alfabética), mas não é a prática padrão.
Você pode enviar ou inserir um enum? Claro que pode , mas como é um tipo personalizado, você precisará escrever seus próprios operadores >> e