Как да използвате enum на език C

How Use Enum C Language



Програмата за изброяване в езика за програмиране C се използва за дефиниране на интегрални постоянни стойности, което е много полезно при писането на чисти и четими програми. Програмистите обикновено използват изброяване, за да определят наименувани интегрални константи в своите програми, за да осигурят по -добра четливост и поддръжка на софтуера. Тази статия ще обсъди подробно enum.

Синтаксис

изброяване <Име на типа изброяване> {
Enumeration_Constant_Element-1,
Enumeration_Constant_Element-2,
Enumeration_Constant_Element-3,
…… .........,
Enumeration_Constant_Element-н,
};

Стойността по подразбиране на Enumeration_Constant_Element-1 е 0, стойността на Enumeration_Constant_Element-2 е 1, стойността на Enumeration_Constant_Element-3 е 2, а стойността на Enumeration_Constant_Element-n е (n-1).







Потопете се дълбоко в Enum

Сега, тъй като знаем синтаксиса за определяне на типа на изброяване, нека разгледаме един пример:



изброяванеГрешка{
IO_ERROR,
DISK_ERROR,
МРЕЖОВА ГРЕШКА
};

Ключовата дума enum винаги трябва да се използва за определяне на типа на изброяване. Така че, когато искате да дефинирате тип изброяване, трябва да използвате преди това ключовата дума enum. След ключовата дума enum трябва да използвате валиден идентификатор, за да дефинирате.



В горния пример компилаторът ще присвои IO_ERROR на интегралната стойност: 0, DISK_ERROR на интегралната стойност: 1 и NETWORK_ERROR на интегралната стойност: 2. По подразбиране на първия изброяващ елемент винаги се присвоява стойността 0, на следващия enum-element получава стойност 1 и т.н.





Това поведение по подразбиране може да бъде променено, ако е необходимо, като се присвои изрично постоянната интегрална стойност, както следва:

изброяванеГрешка{
IO_ERROR= 2,
DISK_ERROR,
МРЕЖОВА ГРЕШКА= 8 ,
PRINT_ERROR
};

В този случай IO_ERROR изрично се присвоява на стойност 2 от програмиста, DISK_ERROR се присвоява на стойност 3 от компилатора, NETWORK_ERROR е изрично присвоена на стойност 8 от програмиста, а PRINT_ERROR е присвоен на следващия интегрална стойност на предишния изброяващ елемент NETWORK_ERROR (т.е. 9) от компилатора.



И така, сега разбирате как да дефинирате потребителски тип изброяване в C. Възможно ли е да се декларира променлива от тип изброяване (тъй като можем да декларираме променлива от целочислено)? Да, така е! Можете да декларирате променливата enum, както следва:

изброяванеГрешка Hw_Error;

Отново, enum е ключовата дума тук, Error е типът enum, а Hw_Error е променлива за изброяване.

Сега ще разгледаме следните примери, за да разберем различните употреби на enum:

  • Пример 1: Използване на дефиниция на изброяване по подразбиране
  • Пример 2: Използване на персонализирана дефиниция на изброяване
  • Пример 3: дефиниция на изброяване с използване на постоянен израз
  • Пример 4: обхват на изброяване

Пример 1: Използване на дефиницията по подразбиране

В този пример ще научите как да дефинирате типа на изброяване с константни стойности по подразбиране. Компилаторът ще се погрижи за присвояването на стойностите по подразбиране на елементите за изброяване. По -долу ще видите примерната програма и съответния изход.

#включва

/ * Определете типа на изброяване */
изброяванеГрешка{
IO_ERROR,
DISK_ERROR,
МРЕЖОВА ГРЕШКА
};

intглавен()
{
изброяванеГрешка Hw_Error; /* Създаване на променлива за изброяване*/

printf ('Задаване на Hw_Error на IO_ERRORн');
Hw_Error=IO_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на DISK_ERRORн');
Hw_Error=DISK_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на NETWORK_ERRORн');
Hw_Error=МРЕЖОВА ГРЕШКА;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

връщане 0;
}

https://lh6.googleusercontent.com/0CHtUqkuIA-okDEPI0_5fZLU6lZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxZZByVoZiVi

Пример 2: Използване на дефиниция по избор на изброяване

В този пример ще научите как да дефинирате типа на изброяване с персонализирана постоянна стойност. Също така този пример ще ви помогне да разберете как инициализирането на персонализираните константи може да се извърши в произволен ред. В този пример ние изрично сме дефинирали постоянната стойност за 1ули 3rdenum елементи (т.е. IO_ERROR и NETWORK_ERROR съответно), но ние пропуснахме изричната инициализация за 2ndи 4thелементи. Сега отговорността на компилатора е да присвои стойностите по подразбиране на 2ndи 4thизброяващи елементи (т.е. DISK_ERROR и PRINT_ERROR съответно). DISK_ERROR ще бъде присвоена на стойност 3, а PRINT_ERROR ще бъде присвоена на стойност 9. По -долу ще видите примерната програма и изхода.

#включва

/* Определете типа на изброяване - Персонализирана инициализация*/
изброяванеГрешка{
IO_ERROR= 2,
DISK_ERROR,
МРЕЖОВА ГРЕШКА= 8,
PRINT_ERROR
};

intглавен()
{

/* Обявете променлива за изброяване*/
изброяванеГрешка Hw_Error;

printf ('Задаване на Hw_Error на IO_ERRORн');
Hw_Error=IO_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на DISK_ERRORн');
Hw_Error=DISK_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на NETWORK_ERRORн');
Hw_Error=МРЕЖОВА ГРЕШКА;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на PRINT_ERRORн');
Hw_Error=PRINT_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

връщане 0;
}

https://lh6.googleusercontent.com/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqlBLy6wzxvr04F-FUwjBy6wzxvr0ag0afDVKafKafKafKafKafVKafKafKafVKafKaf6

Пример 3: Определение на изброяване с използване на постоянен израз

В този пример ще научите как да използвате константния израз за дефиниране на постоянната стойност за елементите на изброяване.

#включва

/* Определете типа на изброяване - персонализирана инициализация с помощта на постоянен израз
тук се използва постоянен израз в случай на:
а. IO_ERROR и
б. МРЕЖОВА ГРЕШКА
Това е необичаен начин за дефиниране на елементите за изброяване; това обаче
програма демонстрира, че този начин на инициализация на изброяващи елементи е възможен в c.
* /


изброяванеГрешка{
IO_ERROR= 1 + 2 * 3 + 4,
DISK_ERROR,
МРЕЖОВА ГРЕШКА= 2 == 2,
PRINT_ERROR
};

intглавен()
{

/* Обявете променлива за изброяване*/
изброяванеГрешка Hw_Error;

printf ('Задаване на Hw_Error на IO_ERRORн');
Hw_Error=IO_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на DISK_ERRORн');
Hw_Error=DISK_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на NETWORK_ERRORн');
Hw_Error=МРЕЖОВА ГРЕШКА;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на PRINT_ERRORн');
Hw_Error=PRINT_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

връщане 0;
}

https://lh4.googleusercontent.com/9FAbPOnM95LiP_UQvg40oHSW4sv34aqpFgasbHMiy06Z_rKEom81TuMCVsfxWaZedtQOMEQx7ef_5qEfRVcNrUvhitDzOc4

Пример 4: enum Scope

В този пример ще научите как правилото за обхват работи за enum. MACRO (#define) може да се използва за дефиниране на константа вместо изброяване, но правилото за обхват не работи за MACRO.

#включва

intглавен()
{

/ * Определете типа на изброяване */
изброяванеГрешка_1{
IO_ERROR= 10,
DISK_ERROR,
МРЕЖОВА ГРЕШКА= 3,
PRINT_ERROR
};


{

/* Определете типа на изброяване във вътрешния обхват*/
изброяванеГрешка_1{
IO_ERROR= двайсет,
DISK_ERROR,
МРЕЖОВА ГРЕШКА= 35,
PRINT_ERROR
};

/* Обявете променлива за изброяване*/
изброяванеГрешка_1 Hw_Error;
printf ('Задаване на Hw_Error на IO_ERRORн');
Hw_Error=IO_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на DISK_ERRORн');
Hw_Error=DISK_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на NETWORK_ERRORн');
Hw_Error=МРЕЖОВА ГРЕШКА;
printf ('Стойност на Hw_Error = %dн',Hw_Error);

printf ('нЗадаване на Hw_Error на PRINT_ERRORн');
Hw_Error=PRINT_ERROR;
printf ('Стойност на Hw_Error = %dн',Hw_Error);
}
връщане 0;
}

Сравнение между изброяване и макрос

Enum Макро
Правилото за обхват е приложимо за enum. Правилото за обхват не е приложимо за макроси.
Присвояването на стойността на изброяване по подразбиране става автоматично.

Enum е много полезен при определяне на голям брой константи. Компилаторът приема инициализация на константна стойност по подразбиране.

Стойностите на макроконстантата трябва винаги да се споменават изрично от програмиста.

Това може да бъде досаден процес за голям брой константи, тъй като програмистът винаги трябва ръчно да дефинира всяка константна стойност, докато дефинира макроса.

Заключение

Изброяващата програма в C може да се счита за незадължителен метод за самостоятелни програми или малки проекти, тъй като програмистите винаги могат да използват макрос вместо изброяване. Опитни програмисти обаче са склонни да използват enum върху макрос за мащабни проекти за разработка на софтуер. Това помага при писането на чисти и четими програми.