Abreviação de enumeração, um enum tipo de variável pode ser encontrado em C (ANSI, não no K&R original), C ++ e C #. A idéia é que, em vez de usar um int para representar um conjunto de valores, um tipo com um conjunto restrito de valores é usado.
Por exemplo, se usarmos as cores do arco-íris, que são
- Vermelho
- laranja
- Amarelo
- Verde
- Azul
- Índigo
- Tolet
Se não existissem enums, você pode usar um #definir (em C) ou const em C ++ / C # para especificar esses valores. Por exemplo
Ints demais para contar!
O problema disso é que existem muitos mais ints do que cores. Se violeta tiver o valor 7, e o programa atribui um valor de 15 a uma variável, então é claramente um erro, mas pode não ser detectado, pois 15 é um valor válido para um int.
Enums para o resgate
Uma enum é um tipo definido pelo usuário que consiste em um conjunto de constantes nomeadas chamadas enumeradores. As cores do arco-íris seriam mapeadas assim:
Agora internamente, o compilador usará um int para retê-los e, se nenhum valor for fornecido, o vermelho será 0, a laranja será 1 etc.
O ponto é que cores do arco-íris é um tipo e apenas outras variáveis do mesmo tipo podem ser atribuídas a ele. C é mais fácil (ou seja, menos estritamente digitado), mas C ++ e C # não permitem atribuição, a menos que você a force usando uma conversão.
Você não está preso a estes compilador valores gerados, você pode atribuir sua própria constante inteira a eles, como mostrado aqui.
Ter azul e índigo com o mesmo valor não é um erro, pois os enumeradores podem incluir sinônimos como escarlate e vermelho.
Diferenças de idioma
Em C, o variável declaração deve ser precedida pela palavra enum como em
No entanto, em C ++, não é necessário, pois cores do arco-íris é um tipo distinto que não precisa do prefixo do tipo enum.
Em C #, os valores são acessados pelo nome do tipo, como em
Qual é o ponto de enums?
O uso de enums aumenta o nível de abstração e permite ao programador pensar no que os valores significam, em vez de se preocupar com como eles são armazenados e acessados. Isso reduz a ocorrência de erros.
Aqui está um exemplo. Temos um conjunto de semáforos com três lâmpadas. vermelho, amarelo e verde. No Reino Unido, a sequência dos semáforos muda nessas quatro fases.
- Vermelho - Tráfego parado.
- Ambos Vermelho e Amarelo - O tráfego ainda parou, mas as luzes estão prestes a mudar para verde.
- Verde - O tráfego pode se mover.
- Amarelo - Aviso de mudança iminente para vermelho.
Exemplo de semáforo
As luzes são controladas escrevendo nos três bits inferiores de um byte de controle. Estes são apresentados como um padrão de bits abaixo em binário, em que RYG representa os três bits. Se R for 1, a luz vermelha está acesa etc.
Nesse caso, é fácil ver que os quatro estados acima correspondem aos valores 4 = Vermelho on, 6 = Vermelho + Amarelo ambos em, 1 = Verde ligado e 2 = Amarelo em.
Com esta função
Usando uma classe em vez de enums
Em C ++ e C #, precisaríamos criar uma classe e depois sobrecarga o operador | permitir Anel-O de tipos luzes de trânsito.
Ao usar enums, evitamos que problemas com outros bits sejam atribuídos ao byte de controle do bulbo. Pode ser que alguns dos outros bits controlem o autoteste ou um comutador "Green Lane". Nesse caso, um bug que permita que esses bits sejam configurados em uso normal pode causar estragos.
Para ter certeza, mascararíamos os bits no SetTrafficlights ()função portanto, não importa qual valor seja passado, apenas os três bits inferiores serão alterados.
Conclusão
As enums têm os seguintes benefícios:
- Eles restringem os valores que a variável enum pode receber.
- Eles o forçam a pensar em todos os valores possíveis que o enum pode assumir.
- Eles são uma constante e não um número, aumentando a legibilidade do Código fonte