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