Что такое Enum в языках программирования?

Сокращение от перечисления, перечисление тип переменной можно найти в C (ANSI, а не в оригинальном K & R), C ++ и C #. Идея в том, что вместо использования ИНТ для представления набора значений вместо этого используется тип с ограниченным набором значений.

Например, если мы используем цвета радуги, которые

  1. красный
  2. апельсин
  3. желтый
  4. зеленый
  5. синий
  6. Индиго
  7. Фиолетовый

Если перечисления не существует, вы можете использовать #define (в С) или Const в C ++ / C # указать эти значения. Например

Слишком много Ints для подсчета!

Проблема в том, что есть еще много Интс чем цвета. Если фиолетовый имеет значение 7, а программа присваивает переменной значение 15, тогда это явно ошибка, но она не может быть обнаружена, поскольку 15 является допустимым значением для типа int.

Перечисления на помощь

Перечисление - это пользовательский тип, состоящий из набора именованных констант, называемых перечислителями. Цвета радуги будут отображаться так:

Теперь внутренне компилятор будет использовать int для их хранения, и если значения не предоставлены, красный будет 0, оранжевый - 1 и т. Д.

instagram viewer

Дело в том, что RainbowColors это тип, и только другие переменные того же типа могут быть назначены этому. C проще (т.е. менее строго типизирован), но C ++ и C # не разрешат присваивание, если вы не принудительно используете его с помощью приведения

Вы не застряли с этим компилятор сгенерированные значения, вы можете назначить им свою собственную целочисленную константу, как показано здесь.

Наличие синего и индиго с одним и тем же значением не является ошибкой, поскольку счетчики могут включать синонимы, такие как алый и малиновый.

Языковые различия

В С переменная декларации должно предшествовать слово перечисление как в

В C ++ это не нужно, так как RainbowColors это отдельный тип, который не нуждается в префиксе типа enum.

В C # значения доступны по имени типа, как в

Какой смысл перечислений?

Использование перечислений повышает уровень абстракции и позволяет программисту задуматься о том, что означают значения, а не беспокоиться о том, как они хранятся и к которым получают доступ. Это уменьшает вероятность появления ошибок.

Вот пример. У нас есть набор светофоров с тремя лампочками- красный, желтый и зеленый. В Великобритании последовательность светофоров меняется на этих четырех этапах.

  1. красный - Движение остановлено.
  2. И то и другое красный и желтый - Движение по-прежнему остановлено, но загорается зеленый свет.
  3. зеленый - Трафик может двигаться.
  4. желтый - Предупреждение о скором изменении на красный.

Пример светофора

Освещение контролируется записью в три нижних бита управляющего байта. Они представлены в виде двоичного шаблона ниже в двоичном формате, где RYG представляет три бита. Если R = 1, красный свет включен и т. Д.

В этом случае легко увидеть, что четыре состояния выше соответствуют значениям 4 = красный 6 = красный + желтый оба включены, 1 = зеленый и 2 = желтый на.

С этой функцией

Использование класса вместо перечислений

В C ++ и C # нам нужно создать класс, а затем перегрузка оператор | позволять ИЛИ- типов светофор.

Используя перечисления, мы предотвращаем проблемы с назначением других битов управляющему байту лампы. Возможно, что некоторые другие биты управляют самотестированием или переключателем «Green Lane». В этом случае ошибка, позволяющая установить эти биты в обычном режиме, может привести к хаосу.

Конечно, мы бы замаскировали биты в SetTrafficlights ()функция поэтому независимо от того, какое значение передается, изменяются только три нижних бита.

Вывод

Перечисления имеют следующие преимущества:

  • Они ограничивают значения, которые может принимать переменная enum.
  • Они заставляют вас задуматься обо всех возможных значениях, которые может принимать перечисление.
  • Они являются константой, а не числом, увеличивая читабельность исходный код
instagram story viewer