Qual é o tamanho de enum?


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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *