Сокращенно от перечисления, тип переменной enum можно найти в C (ANSI, а не в исходном K&R), C ++ и C #. Идея состоит в том, что вместо использования int для представления набора значений вместо этого используется тип с ограниченным набором значений.
Например, если мы используем цвета радуги:
- Red
- Orange
- Желтый
- Зеленый
- Синий
- Индиго
- Фиолетовый
Если перечислений не существует, вы можете использовать #define (в C) или const в C ++/C #, чтобы указать эти значения. Например,
Слишком много Ints, чтобы сосчитать!
Проблема в том, что целых чисел гораздо больше, чем цветов. Если фиолетовый имеет значение 7, а программа присваивает переменной значение 15, то это явно ошибка, но может не быть обнаружена, поскольку 15 является допустимым значением для int.
Перечисления на помощь
Перечисление – это определяемый пользователем тип, состоящий из набора именованных констант, называемых перечислителями. Цвета радуги будут отображаться следующим образом :
Теперь внутри компилятор будет использовать int для их хранения, а если значения не указаны, красный будет 0, оранжевый – 1 и т. д.
Какая польза от Enum?
Дело в том, что rainbowcolors – это тип, и ему могут быть присвоены только другие переменные того же типа. C проще (т. Е. Менее строго типизирован), но C ++ и C # не допускают присвоения, если вы не используете принудительное преобразование.
t застрял с этими значениями, сгенерированными компилятором, вы можете назначить им свою целочисленную константу, как показано здесь.
Наличие синего и индиго с одним и тем же значением не ошибка, поскольку счетчики могут включать синонимы, такие как алый и малиновый.
Языковые различия
В C объявление переменной должно быть перед словом enum , как в
Однако в C ++ он не нужен как rainbowcolors – это отдельный тип, которому не нужен префикс типа перечисления.
В C # доступ к значениям осуществляется по имени типа, как в
В чем смысл перечислений?
Использование перечислений увеличивает уровень абстракции и позволяет программисту думать о том, что означают значения, а не беспокоиться о том, как они хранятся и к которым осуществляется доступ. Это уменьшает количество ошибок.
Вот пример. У нас есть набор светофоров с тремя лампочками- красный , желтый и зеленый . В Великобритании последовательность светофоров меняется в эти четыре фазы.
- Красный – трафик Остановлен.
- И красный , и желтый – движение по-прежнему остановлено, но индикатор собирается стать зеленым..
- Зеленый – движение может двигаться.
- Желтый – предупреждение о неизбежном переходе на красный цвет. .
Пример светофора
Управление освещением осуществляется записью в три нижних бита управляющего байта. . Они представлены ниже в виде битового шаблона в двоичном формате, где RYG представляют три бита. Если R равно 1, горит красный свет и т. Д.
В этом случае легко увидеть, что четыре состояния выше соответствуют значениям 4 = красный горит, 6 = красный + желтый оба горит, 1 = зеленый горит и 2 = Желтый включен.
С этой функцией
Использование класса вместо перечислений
В C ++ и C # нам нужно создать класс, а затем перегрузить оператор | чтобы разрешить OR-ing типов
Используя перечисления, мы предотвращаем проблемы с назначением других бит лампочке байт управления. Возможно, некоторые другие биты управляют самотестированием или переключателем «Зеленой полосы». В этом случае ошибка, позволяющая установить эти биты для нормального использования, может нанести серьезный ущерб.
Чтобы быть уверенным, мы бы замаскировали биты в SetTrafficlights () , поэтому независимо от того, какое значение передается, изменяются только три нижних бита.
Заключение
Перечисления имеют следующие преимущества:
- Они ограничивают значения, которые может принимать переменная перечисления.
- Они заставляют задуматься обо всех возможных значениях, которые может принимать перечисление.
- Они представляют собой константу, а не число, что увеличивает читаемость исходного кода.