Compartilhar via


Declarações de enumeração C

Uma enumeração consiste em um conjunto de constantes inteiros nomeadas. Uma declaração de tipo de enumeração fornece o nome da marca de enumeração (opcional). E define o conjunto de identificadores inteiros nomeados (chamados de conjunto de enumeração, constantes de enumerador, enumeradores ou membros). Uma variável do tipo de enumeração armazena um dos valores do conjunto de enumeração definido por esse tipo.

Variáveis de enum tipo podem ser usadas em expressões de indexação e como operandos de todos os operadores aritméticos e relacionais. As enumerações fornecem uma alternativa à diretiva de #define pré-processador com as vantagens que os valores podem ser gerados para você e obedecem às regras de escopo normais.

No ANSI C, as expressões que definem o valor de uma constante de enumerador sempre têm int tipo. Isso significa que o armazenamento associado a uma variável de enumeração é o armazenamento necessário para um único int valor. Uma constante de enumeração ou um valor de tipo enumerado pode ser usado em qualquer lugar em que a linguagem C permita uma expressão inteiro.

Sintaxe

enum-specifier:
enum identifier optar{enumerator-list}
enum identifier

enumerator-list:
enumerator
enumerator-list , enumerator

enumerator:
enumeration-constant
enumeration-constant = constant-expression

enumeration-constant:
identifier

O opcional identifier nomeia o tipo de enumeração definido por enumerator-list. Esse identificador geralmente é chamado de "marca" da enumeração especificada pela lista. Um especificador de tipo declara identifier ser a marca da enumeração especificada pelo enumerator-list nãominal, conforme visto aqui:

enum identifier
{
    // enumerator-list
}

Define enumerator-list os membros do conjunto de enumeração.

Se a declaração de uma marca estiver visível, declarações posteriores que usam a marca, mas omitem enumerator-list especificar o tipo enumerado declarado anteriormente. A marca deve se referir a um tipo de enumeração definido e esse tipo de enumeração deve estar no escopo atual. Como o tipo de enumeração é definido em outro lugar, ele enumerator-list não aparece nesta declaração. Declarações de tipos derivados de enumerações e declarações para tipos de enumeração typedef podem usar a marca de enumeração antes que o tipo de enumeração seja definido.

Cada enumeration-constant um em um enumerator-list nome um valor do conjunto de enumeração. Por padrão, o primeiro enumeration-constant é associado ao valor 0. O próximo enumeration-constant na lista é associado ao valor de ( constant-expression + 1), a menos que você o associe explicitamente a outro valor. O nome de um enumeration-constant é equivalente ao seu valor.

Você pode usar enumeration-constant = constant-expression para substituir a sequência padrão de valores. Ou seja, se enumeration-constant = constant-expression aparecer no enumerator-list, o enumeration-constant valor será associado ao valor fornecido por constant-expression. O constant-expression tipo deve ter int e pode ser negativo.

As regras a seguir se aplicam aos membros de um conjunto de enumeração:

  • Um conjunto de enumeração pode conter valores de constante duplicados. Por exemplo, você pode associar o valor 0 a dois identificadores diferentes, por exemplo, membros nomeados null e zero, no mesmo conjunto.

  • Os identificadores na lista de enumeração devem ser distintos de outros identificadores no mesmo escopo com a mesma visibilidade. Isso inclui nomes de variáveis comuns e identificadores em outras listas de enumeração.

  • As marcas de enumeração obedecem às regras de escopo normais. Eles devem ser distintos de outras marcas de enumeração, estrutura e união com a mesma visibilidade.

Exemplos

Estes exemplos ilustram declarações de enumeração:

enum DAY            /* Defines an enumeration type    */
{
    saturday,       /* Names day and declares a       */
    sunday = 0,     /* variable named workday with    */
    monday,         /* that type                      */
    tuesday,
    wednesday,      /* wednesday is associated with 3 */
    thursday,
    friday
} workday;

O valor 0 é associado saturday por padrão. O identificador sunday é definido explicitamente como 0. Os identificadores restantes recebem os valores de 1 a 5 por padrão.

Neste exemplo, um valor do conjunto DAY é atribuído à variável today.

enum DAY today = wednesday;

O nome da constante de enumeração é usado para atribuir o valor. Como o DAY tipo de enumeração foi declarado anteriormente, somente a marca DAY de enumeração é necessária.

Para atribuir explicitamente um valor inteiro a uma variável de um tipo de dados enumerado, use uma conversão de tipo:

workday = ( enum DAY ) ( day_value - 1 );

Essa conversão é recomendada em C, mas não é necessária.

enum BOOLEAN  /* Declares an enumeration data type called BOOLEAN */
{
    false,     /* false = 0, true = 1 */
    true
};

enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */

Essa declaração também pode ser especificada como

enum BOOLEAN { false, true } end_flag, match_flag;

ou como

enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;

Um exemplo que usa essas variáveis pode ter esta aparência:

if ( match_flag == false )
    {
     .
     .   /* statement */
     .
    }
    end_flag = true;

Tipos de dados de enumerador sem nome também podem ser declarados. O nome do tipo de dados é omitido, mas as variáveis podem ser declaradas. A variável response é uma variável do tipo definido:

enum { yes, no } response;

Consulte também

Enumerações (C++)