C enum (перечисление)

Перечисление — это базовый тип данных в C, используемый для определения набора констант с дискретными значениями. Оно делает данные более краткими и читаемыми.

Типы перечислений обычно используются для присвоения имён группе связанных констант в программе, что делает программу более читаемой и удобной в сопровождении.

Чтобы определить тип перечисления, нужно использоватьenum— ключевое слово, за которым следует имя типа перечисления, а с помощью фигурных скобок{}заключается набор констант перечисления. Каждая константа перечисления может быть представлена идентификатором, и для них также можно указать целочисленное значение. Если не указано, по умолчанию с0Начинает увеличиваться.

Формат определения enum:

enum 枚举名 {枚举元素1,枚举元素2,……};

Далее рассмотрим пример: в неделе 7 дней. Если мы не используем перечисления, нам нужно использовать #define, чтобы определить псевдоним для каждого целого числа:

#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7

Это выглядит как довольно много кода. Далее давайте рассмотрим использование перечислений:

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};

Не выглядит ли это более кратко?

Примечание:Значение по умолчанию первого элемента перечисления — целое число 0, а значение каждого последующего элемента перечисления равно значению предыдущего элемента плюс 1. В этом примере мы определяем значение первого элемента перечисления как 1, второго как 2, и так далее.

Вы можете изменять значения элементов перечисления при определении типа перечисления:

enum season {spring, summer=3, autumn, winter};

Элементы перечисления без указанного значения имеют значение предыдущего элемента плюс 1. То есть весна — 0, лето — 3, осень — 4, зима — 5

Определение переменных перечисления

Ранее мы только объявили тип перечисления. Далее давайте посмотрим, как определить переменные перечисления.

Мы можем определить переменные перечисления следующими тремя способами

1. Сначала определите тип перечисления, затем определите переменную перечисления

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2. Определите переменную перечисления при определении типа перечисления

enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3. Опустите имя enum и напрямую определите переменную enum

enum
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

Пример

#include <stdio.h> enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; int main() { enum DAY day; day = WED; printf("%d",day); return 0; }

Результат вывода приведённого выше примера:

3

В C типы enum обрабатываются как типы int или unsigned int, поэтому согласно спецификации языка C не существует способа обойти тип enum.

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

В следующем примере используется цикл for для перебора элементов enum:

Пример

#include <stdio.h> enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day; int main() { // Обход элементов enum for (day = MON; day <= SUN; day++) { printf("Элемент перечисления: %d\n", day); } }

Результат вывода приведённого выше примера:

枚举元素:1 
枚举元素:2 
枚举元素:3 
枚举元素:4 
枚举元素:5 
枚举元素:6 
枚举元素:7

Следующий тип перечисления не является непрерывным, и этот вид перечисления нельзя перебрать.

enum
{
    ENUM_0,
    ENUM_10 = 10,
    ENUM_11
};

Использование перечислений в switch:

Пример

#include <stdio.h> #include <stdlib.h> int main() { enum color { red=1, green, blue }; enum color favorite_color; /*Пользователь вводит число для выбора цвета*/ printf("Пожалуйста, введите ваш любимый цвет: (1. красный, 2. зеленый, 3. синий):"); scanf("%u", &favorite_color); /*Вывод результата*/ switch (favorite_color) { case red: printf("Цвет, который вам нравится — красный."); break; case green: printf("Ваш любимый цвет — зеленый"); break; case blue: printf("Ваш любимый цвет — синий"); break; default: printf("Вы не выбрали свой любимый цвет"); } return 0; }

Результат вывода приведённого выше примера:

请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色

Преобразование целого числа в enum

Следующий пример преобразует целые числа в перечисления:

Пример

#include <stdio.h> #include <stdlib.h> int main() { enum day { saturday, sunday, monday, tuesday, wednesday, thursday, friday } workday; int a = 1; enum day weekend; weekend = ( enum day ) a; //Преобразование типа //weekend = a; //ошибка printf("weekend:%d",weekend); return 0; }

Результат вывода приведённого выше примера:

weekend:1
Другие расширения