Значения перечислений и диапазоны
Управляйте базовыми целыми числами.
«Значения перечислений и диапазоны» — бесплатный урок C Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Присваивание явных значений
Необязательно использовать последовательность 0, 1, 2 по умолчанию. С помощью = любому имени можно присвоить целое число.
Это полезно, когда числа должны совпадать с внешней системой, например с кодами состояния HTTP.
enum Http { OK = 200, NOT_FOUND = 404, ERROR = 500 };Вывод пользовательских значений
После присваивания сохраняются и выводятся именно эти числа.
Здесь имена перечисления напрямую соответствуют стандартным кодам HTTP.
#include <stdio.h>
enum Http { OK = 200, NOT_FOUND = 404, ERROR = 500 };
int main(void) {
printf("%d %d\n", OK, NOT_FOUND);
return 0;
}Сочетание явных значений и значений по умолчанию
Если задать некоторые значения, а другие оставить пустыми, каждое пустое имя продолжает отсчёт от предыдущего значения.
Поэтому имя сразу после = 10 получает значение 11, затем 12 и так далее.
#include <stdio.h>
enum N { A = 10, B, C, D = 100, E };
int main(void) {
printf("%d %d %d %d %d\n", A, B, C, D, E);
return 0;
}Начало с единицы
Распространённый приём — сделать первое значение равным 1 вместо 0, чтобы нумерация соответствовала человеческому счёту.
Здесь MON равно 1, поэтому дни получают значения от 1 до 7.
#include <stdio.h>
enum Day { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
int main(void) {
printf("%d %d\n", MON, SUN);
return 0;
}Повторяющиеся значения разрешены
Два имени перечисления могут иметь одно и то же целочисленное значение. C не требует, чтобы они были уникальными.
Иногда это используют для создания псевдонимов одного и того же понятия.
#include <stdio.h>
enum Color { RED = 1, CRIMSON = 1, BLUE = 2 };
int main(void) {
printf("%d %d\n", RED, CRIMSON);
return 0;
}Отрицательные значения
Значения перечисления могут быть и отрицательными. Это знаковые целые числа.
Так можно представить коды ошибок меньше нуля вместе с нейтральным или положительным диапазоном.
#include <stdio.h>
enum Temp { COLD = -1, NORMAL = 0, HOT = 1 };
int main(void) {
printf("%d %d %d\n", COLD, NORMAL, HOT);
return 0;
}Приём с маркером COUNT
Если перечислить элементы, начиная с 0, и добавить последнее имя, это имя будет равно количеству элементов.
Приём с COUNT автоматически даёт размер списка даже после добавления новых элементов.
#include <stdio.h>
enum Fruit { APPLE, PEAR, KIWI, FRUIT_COUNT };
int main(void) {
printf("%d fruits\n", FRUIT_COUNT);
return 0;
}Перечисления как индексы массивов
Поскольку значения перечислений являются целыми числами, они отлично подходят для индексов массивов.
В сочетании с приёмом COUNT можно задать массив ровно нужного размера и индексировать его понятными именами.
#include <stdio.h>
enum Fruit { APPLE, PEAR, KIWI, FRUIT_COUNT };
int main(void) {
int stock[FRUIT_COUNT] = {5, 3, 8};
printf("%d\n", stock[PEAR]);
return 0;
}Базовый тип
В стандартном C значения перечисления хранятся в целочисленном типе, выбранном компилятором, обычно в int.
Тип достаточно широк, чтобы вместить каждое определённое значение, поэтому даже большие или отрицательные константы помещаются в него.
#include <stdio.h>
enum Big { SMALL = 0, LARGE = 1000000 };
int main(void) {
printf("%d\n", LARGE);
return 0;
}Нет встроенной проверки диапазона
C не запрещает присваивать переменной перечисления значение, отсутствующее в списке.
Приведённое ниже присваивание компилируется и выполняется. Вы сами отвечаете за корректность значений.
#include <stdio.h>
enum Level { LOW, MID, HIGH };
int main(void) {
enum Level x = 99;
printf("%d\n", x);
return 0;
}Перебор диапазона
Если перечисление идёт от 0 до маркера COUNT, можно простым циклом for перебрать все значения.
Этот цикл проходит по каждому определённому элементу до значения количества, не включая его.
#include <stdio.h>
enum Fruit { APPLE, PEAR, KIWI, FRUIT_COUNT };
int main(void) {
for (int f = APPLE; f < FRUIT_COUNT; f++)
printf("%d ", f);
printf("\n");
return 0;
}Быстрая проверка
Проанализируйте смешанные значения перечисления.
Итоги
Можно задавать явные значения перечисления, сочетать их со значениями по умолчанию, повторять значения и использовать отрицательные числа.
Приём с маркером COUNT автоматически отслеживает размер списка, а перечисления отлично подходят для индексов массивов. Помните: C не проверяет диапазон, поэтому проверяйте значения самостоятельно.
Часто задаваемые вопросы
Урок «Значения перечислений и диапазоны» бесплатный?
Да — полный текст урока «Значения перечислений и диапазоны» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Значения перечислений и диапазоны»?
Управляйте базовыми целыми числами. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Значения перечислений и диапазоны»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение перечислений
- Значения перечислений и диапазоны
- Переменные const
- Константы #define