Программы
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;
Также может быть вам интересно:

Выравнивание структур

Неочевидная тема. Для многих, кто программировал только на высокоуровневых ЯП, сложно принять, что заботиться нужно даже о порядке полей в структурах

Читать »

Битовые поля в Си

Довольно уникальная для ЯП фишка Си – битовые поля структур

Читать »
Фото Python: Встроенные типы данных (list, set, dict, etc)

Python: Встроенные типы данных (list, set, dict, etc)

В Python есть множество встроенных типов данных. Их использование значительно упрощает жизнь и ускоряет разработку программных продуктов.

Фото Python: типы данных, переменные, логическое ветвление и циклы

Python: типы данных, переменные, логическое ветвление и циклы

Первая часть заметок о Python. О базовых типах, переменных, ветвлении и циклах.

Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем постраничную пагинацию на Django сайт

Добавляем постраничную пагинацию на Django сайт

На сайтах часто встречаются многостраничные объекты: список товаров, список заметок и т.д. Поэтому важно уметь добавить навигацию по страницам на Django-проекте.

Фото Новый оператор match-case в Python

Новый оператор match-case в Python

В новой версии Python (3.10) появится новый оператор. Новый оператор сопоставления по шаблону (match-case).

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.