Программы
Enum - перечисляемый тип данных

Enum - перечисляемый тип данных

Распространённый тип данных во многих языках программирования. Как же он выглядит в Си?

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

typedef enum Bool {
  FALSE,
  TRUE
} Bool;

Значения полей стартуют с 0 и увеличиваются на 1 ("сахар" над целочисленным типом). Таким образом наш FALSE и TRUE будут работать адекватно. За исключением случаев, когда мы другую "истину" попытаемся сравнить с нашей.

Рассмотрим ещё один пример – работаем с месяцами:

#include <stdio.h>

const char *month_ru[] = {
  "",  // Делаем "отступ". Месяцы же с 1!
  "Январь", "Февраль",
  "Март", "Апрель", "Май",
  "Июнь", "Июль", "Август",
  "Сентябрь", "Октябрь", "Ноябрь",
  "Декабрь",
};

enum Month {
  // Указываем, что поле 1, а не 0 как по умолчанию.
  // Следующие значение продолжатся с 2-х.
  JANUARY = 1,
  FEBRUARY,
  MARCH, APRIL, MAY,
  JUNE, JULY, AUGUST,
  SEPTEMBER, OCTOBER, NOVEMBER,
  DECEMBER,
};

int main() {
  enum Month mon;

  // Воспользуемся тем,
  // что мы знаем внутреннее представление enum
  scanf("%d", &mon);
  puts(month_ru[mon]);

  if (mon >= JUNE && mon <= AUGUST) {
    puts("Лето!");
  }

  return 0;
}

Попробуйте сломать данную программу. Благо – мы для краткости и понятности не добавили никакой обработки исключительных ситуаций.

Также стоит знать о том, что мы можем для разных Enum значений задачть одно и то же число. Например:

typedef enum Bool {
  FALSE = 0,
  TRUE = 1,
  false = 0,
  true = 1,
} Bool;
Изображение Изучаем язык программирования Си