Синтаксис
перерахуванняEnumeration_Constant_Element-1,
Enumeration_Constant_Element-2,
Enumeration_Constant_Element-3,
.. ,
Enumeration_Constant_Element-n,
;
Значення за замовчуванням Enumeration_Constant_Element-1 дорівнює 0, значення Enumeration_Constant_Element-2 дорівнює 1, значення Enumeration_Constant_Element-3 дорівнює 2, а значення Enumeration_Constant_Element-n дорівнює (n-1).
Глибоке занурення в Енум
Тепер, оскільки ми знаємо синтаксис для визначення типу перерахування, давайте розглянемо приклад:
помилка перелікуIO_ERROR,
DISK_ERROR,
ПОМИЛКА МЕРЕЖІ
;
Ключове слово “перелік” завжди слід використовувати для визначення типу перерахування. Отже, кожного разу, коли ви хочете визначити тип перерахування, ви повинні використовувати ключове слово “перелік” раніше
У наведеному вище прикладі компілятор призначить IO_ERROR інтегральному значенню: 0, DISK_ERROR інтегральному значенню: 1 та NETWORK_ERROR інтегральному значенню: 2. За замовчуванням першому елементу перерахування завжди присвоюється значення 0, наступному елементу перерахування - значення 1 тощо.
Цю поведінку за замовчуванням можна змінити, якщо це необхідно, присвоївши постійне значення інтегралу явним чином, наступним чином:
помилка перелікуIO_ERROR = 2,
DISK_ERROR,
NETWORK_ERROR = 8 ,
PRINT_ERROR
;
У цьому випадку IO_ERROR програмістом явно присвоюється значення 2, DISK_ERROR компілятором присвоюється значення 3, NETWORK_ERROR програмістом явно присвоюється значення 8, а PRINT_ERROR присвоюється наступному інтегральне значення попереднього елемента перерахування NETWORK_ERROR (i.e., 9) упорядником.
Отже, тепер ви розумієте, як визначити визначений користувачем тип перерахування в C. Чи можна оголосити змінну типу enum (як ми можемо оголосити змінну цілочисельного типу)? Так! Ви можете оголосити змінну enum наступним чином:
enum Помилка Hw_Error;Знову ж таки, "перелік" - це ключове слово тут, "Помилка" - тип переліку, а "Hw_Error" - змінна переліку.
Тепер ми розглянемо наступні приклади, щоб зрозуміти різні звички enum:
- Приклад 1: Використання визначення перерахування за замовчуванням
- Приклад 2: Використання користувацького визначення перерахування
- Приклад 3: визначення переліку за допомогою постійного виразу
- Приклад 4: обсяг переліку
Приклад 1: Використання визначення за замовчуванням
У цьому прикладі ви дізнаєтесь, як визначити тип перерахування зі значеннями констант за замовчуванням. Компілятор подбає про присвоєння значень за замовчуванням елементам перерахування. Нижче ви побачите приклад програми та відповідний результат.
#включати/ * Визначити тип перерахування * /
Помилка переліку
IO_ERROR,
DISK_ERROR,
ПОМИЛКА МЕРЕЖІ
;
int main ()
enum Помилка Hw_Error; / * Створення змінної переліку * /
printf ("Встановлення Hw_Error на IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error на DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error до NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
повернути 0;
Приклад 2: Використання користувацького визначення переліку
У цьому прикладі ви дізнаєтесь, як визначити тип перерахування за допомогою користувацької константи. Крім того, цей приклад допоможе вам зрозуміти, як ініціалізація користувацьких констант може бути виконана в будь-якому випадковому порядку. У цьому прикладі ми чітко визначили значення константи для 1вул і 3рд елементи переліку (i.e., IO_ERROR та NETWORK_ERROR, відповідно), але ми пропустили явну ініціалізацію для 2й та 4го елементів. Тепер відповідальність компілятора - присвоїти значення 2 за замовчуваннямй та 4го елементи переліку (i.e., DISK_ERROR та PRINT_ERROR, відповідно). DISK_ERROR буде присвоєно значення 3, а PRINT_ERROR - значення 9. Нижче ви побачите приклад програми та результати.
#включати/ * Визначити тип переліку - Спеціальна ініціалізація * /
Помилка переліку
IO_ERROR = 2,
DISK_ERROR,
NETWORK_ERROR = 8,
PRINT_ERROR
;
int main ()
/ * Оголосити змінну перерахування * /
enum Помилка Hw_Error;
printf ("Встановлення Hw_Error на IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error на DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error до NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення помилки Hw_Error до PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
повернути 0;
Приклад 3: Визначення перечислення за допомогою постійного виразу
У цьому прикладі ви дізнаєтеся, як за допомогою виразу константи визначити значення константи для елементів переліку.
#включати/ * Визначте тип переліку - користувацька ініціалізація за допомогою константного виразу
тут використовується постійний вираз у випадку:
a. IO_ERROR та
b. ПОМИЛКА МЕРЕЖІ
Це незвичний спосіб визначення елементів переліку; проте це
програма демонструє, що такий спосіб ініціалізації елементів перерахування можливий у c.
* /
помилка переліку
IO_ERROR = 1 + 2 * 3 + 4,
DISK_ERROR,
ПОМИЛКА МЕРЕЖІ = 2 == 2,
PRINT_ERROR
;
int main ()
/ * Оголосити змінну перерахування * /
enum Помилка Hw_Error;
printf ("Встановлення Hw_Error на IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error на DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error до NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення помилки Hw_Error до PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
повернути 0;
Приклад 4: enum Scope
У цьому прикладі ви дізнаєтесь, як правило обсягу працює для enum. MACRO (#define) міг бути використаний для визначення константи замість переліку, але правило масштабування не працює для MACRO.
#включатиint main ()
/ * Визначити тип перерахування * /
enum Помилка_1
IO_ERROR = 10,
DISK_ERROR,
NETWORK_ERROR = 3,
PRINT_ERROR
;
/ * Визначте тип перерахування у внутрішній області * /
enum Помилка_1
IO_ERROR = 20,
DISK_ERROR,
NETWORK_ERROR = 35,
PRINT_ERROR
;
/ * Оголосити змінну перерахування * /
enum Error_1 Hw_Error;
printf ("Встановлення Hw_Error на IO_ERROR \ n");
Hw_Error = IO_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error на DISK_ERROR \ n");
Hw_Error = DISK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення Hw_Error до NETWORK_ERROR \ n");
Hw_Error = NETWORK_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
printf ("\ nВстановлення помилки Hw_Error до PRINT_ERROR \ n");
Hw_Error = PRINT_ERROR;
printf ("Значення Hw_Error =% d \ n", Hw_Error);
повернути 0;
Порівняння переліку та макросу
Перелік | Макрос |
Правило масштабування застосовується до переліку. | Правило масштабування не застосовується до макросів. |
Призначення значення за замовчуванням відбувається автоматично. Enum дуже корисний у визначенні великої кількості констант. Компілятор виконує ініціалізацію постійного значення за замовчуванням. | Програміст завжди повинен чітко згадувати значення константи макросу. Це може бути нудним процесом для великої кількості констант, оскільки програміст повинен завжди вручну визначати кожне значення константи, визначаючи макрос. |
Висновок
Програму перерахування на мові C можна розглядати як додатковий метод для окремих програм або невеликих проектів, оскільки програмісти завжди можуть використовувати макрос замість переліку. Однак досвідчені програмісти, як правило, використовують перелічення макросів для масштабних проектів з розробки програмного забезпечення. Це допомагає писати чисті та читабельні програми.