0Pricing
C Academy · Урок

Значения перечислений и диапазоны

Управляйте базовыми целыми числами.

«Значения перечислений и диапазоны» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение перечислений
  2. Значения перечислений и диапазоны
  3. Переменные const
  4. Константы #define
← Назад к C Academy