Определение перечислений
Создавайте понятные именованные значения.
«Определение перечислений» — бесплатный урок C Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Что такое перечисление
Перечисление — это определяемый пользователем тип, объединяющий набор именованных целочисленных констант.
Вместо того чтобы помнить, что 0 означает понедельник, а 1 — вторник, Вы даёте этим числам понятные имена. Это делает код яснее и уменьшает вероятность ошибок.
Базовый синтаксис
Перечисление объявляется с помощью ключевого слова enum, имени тега и списка имён в фигурных скобках.
Каждое имя становится константой, которую можно использовать везде, где ожидается целое число.
enum Weekday { MON, TUE, WED, THU, FRI };Значения по умолчанию начинаются с 0
По умолчанию первое имя получает значение 0, а каждое следующее — значение на единицу больше предыдущего.
Поэтому в enum Weekday MON равно 0, TUE — 1, WED — 2 и так далее.
#include <stdio.h>
enum Weekday { MON, TUE, WED, THU, FRI };
int main(void) {
printf("%d %d %d\n", MON, TUE, WED);
return 0;
}Объявление переменной перечисления
После создания типа перечисления можно создавать переменные этого типа.
Переменная хранит одно из именованных значений. На уровне реализации это всего лишь int.
#include <stdio.h>
enum Weekday { MON, TUE, WED, THU, FRI };
int main(void) {
enum Weekday today = WED;
printf("today = %d\n", today);
return 0;
}Почему перечисления повышают читаемость
Сравните if (state == 2) и if (state == PAUSED).
Второй вариант понятен сам по себе. Перечисления позволяют компилятору отслеживать смысл, а Вам — читать чистый код с понятными именами вместо загадочных чисел.
enum Status { RUNNING, PAUSED, STOPPED };Использование перечислений с оператором выбора
Перечисления естественно сочетаются с операторами switch. Каждое именованное значение становится понятной меткой ветви.
Это один из самых распространённых вариантов использования перечислений на практике.
#include <stdio.h>
enum Status { RUNNING, PAUSED, STOPPED };
int main(void) {
enum Status s = PAUSED;
switch (s) {
case RUNNING: printf("running\n"); break;
case PAUSED: printf("paused\n"); break;
case STOPPED: printf("stopped\n"); break;
}
return 0;
}Перечисления — это целые числа
Константы перечисления взаимозаменяемы с целыми числами. С ними можно выполнять арифметические операции и сравнения.
Такая гибкость удобна, но означает, что C не помешает Вам сохранить число, выходящее за допустимый диапазон.
#include <stdio.h>
enum Level { LOW, MID, HIGH };
int main(void) {
enum Level next = LOW + 1;
printf("%d\n", next);
return 0;
}Анонимные перечисления
Имя тега можно опустить, если нужны только константы, а не именованный тип.
Это быстрый способ определить группу связанных целочисленных констант.
#include <stdio.h>
enum { RED, GREEN, BLUE };
int main(void) {
printf("%d %d %d\n", RED, GREEN, BLUE);
return 0;
}Соглашения об именовании
По соглашению имена констант перечисления записывают ПРОПИСНЫМИ_БУКВАМИ, как и имена макросов.
Это показывает читателям, что значение является неизменяемой константой. Для имени тега часто используют CamelCase или PascalCase.
enum TrafficLight { LIGHT_RED, LIGHT_YELLOW, LIGHT_GREEN };Сочетание с typedef
Повторять enum Weekday везде многословно. typedef позволяет использовать короткое имя.
После typedef можно объявлять переменные как Weekday today;, не указывая ключевое слово enum.
#include <stdio.h>
typedef enum { MON, TUE, WED } Weekday;
int main(void) {
Weekday d = TUE;
printf("%d\n", d);
return 0;
}Область видимости констант перечисления
Имена констант перечисления находятся в одном пространстве имён с обычными идентификаторами в своей области видимости.
Это означает, что два перечисления в одной области видимости не могут повторно использовать одно и то же имя константы. Выбирайте разные имена, чтобы избежать конфликтов.
enum A { OPEN, CLOSED };
enum B { LOCKED, UNLOCKED };Быстрая проверка
Проверьте, как Вы поняли значения перечислений по умолчанию.
Итоги
Перечисление определяет именованные целочисленные константы. Первая получает значение 0, а каждое следующее имя — значение на единицу больше, если не указать иное.
Перечисления делают код понятнее, хорошо сочетаются с switch, а с помощью typedef их запись можно сократить. Далее мы рассмотрим пользовательские значения и диапазоны.
Часто задаваемые вопросы
Урок «Определение перечислений» бесплатный?
Да — полный текст урока «Определение перечислений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение перечислений»?
Создавайте понятные именованные значения. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Определение перечислений»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение перечислений
- Значения перечислений и диапазоны
- Переменные const
- Константы #define