Как использовать enum на языке C

How Use Enum C Language



Программа enum на языке программирования 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 - это тип перечисления, а Hw_Error - это переменная перечисления.

Теперь мы рассмотрим следующие примеры, чтобы понять различные варианты использования enum:

  • Пример 1: Использование определения перечисления по умолчанию
  • Пример 2: Использование определения настраиваемого перечисления
  • Пример 3: определение перечисления с использованием постоянного выражения
  • Пример 4: область действия перечисления

Пример 1: Использование определения перечисления по умолчанию

В этом примере вы узнаете, как определить тип перечисления с постоянными значениями по умолчанию. Компилятор позаботится о присвоении значений по умолчанию элементам перечисления. Ниже вы увидите пример программы и соответствующий результат.

#включают

/ * Определяем тип перечисления * /
перечислитьОшибка{
IO_ERROR,
DISK_ERROR,
ОШИБКА СЕТИ
};

intглавный()
{
перечислитьОшибка Hw_Error; / * Создание переменной enum * /

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_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBWoiMOhzApzXey4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBVoiMOhzAQPzXey4

Пример 2: Использование определения настраиваемого перечисления

В этом примере вы узнаете, как определить тип перечисления с помощью настраиваемого постоянного значения. Кроме того, этот пример поможет вам понять, как можно выполнить инициализацию пользовательских констант в любом случайном порядке. В этом примере мы явно определили постоянное значение для 1ули 3rdперечисления элементов (т.е. 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/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqlBvlj6wz

Пример 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_5qEfRVcNrUvhitDzOcTvXTvOilby4hilby4h

Пример 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
};

/ * Объявить переменную перечисления * /
перечислить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. Правило области действия не применимо для макроса.
Назначение значения Enum по умолчанию происходит автоматически.

Enum очень полезен при определении большого количества констант. Компилятор использует инициализацию постоянного значения по умолчанию.

Программист всегда должен явно указывать значения макроконстант.

Это может быть утомительным процессом для большого количества констант, поскольку программист всегда должен вручную определять каждое постоянное значение при определении макроса.

Заключение

Программу перечисления на C можно рассматривать как дополнительный метод для автономных программ или небольших проектов, поскольку программисты всегда могут использовать макрос вместо перечисления. Однако опытные программисты склонны использовать enum over macro для крупномасштабных проектов разработки программного обеспечения. Это помогает писать чистые и читаемые программы.