Типичная ошибка
После того, как константа перечисления определена, попытка присвоить ей другое значение является синтаксической ошибкой.
Хороший стиль программирования
Использование перечислений вместо целых констант облегчает чтение программы.
Идентификаторы в enum должны быть уникальными, но отдельные константы перечисления могут иметь одинаковые целые значения.
Набор идентификаторов перечислимого типа — собственный уникальный тип, отличающийся от других целочисленных типов.
Перечислимые константы могут определяться и инициализироваться произвольными целочисленными константами, а также константными выражениями:
enum ages (milton = 47, ira, harold = 56, philip = harold + 7};
Обратите внимание на то, что когда нет явного инициализатора, применяется правило по умолчанию, таким образом - ira = 48. Значения перечислимых констант могут быть не уникальными.
Каждое перечисление является отдельным типом. Типом элемента перечисления является само перечисление. Например, в
enum Keyword {ASM, AUTO, BREAK};
AUTO имеет тип Keyword.
Типичная ошибка
Присвоение целого эквивалента константы перечисления переменной перечислимого типа приводит к замечанию (предупреждению) компилятора.
Перечислимая константа может быть объявлена анонимно, то есть без имени типа.
enum {FALSE, TRUE};
enum {lazy, hazy, crazy} why;
Первое объявление — распространенный способ объявления мнемонических целочисленных констант. Второе объявление объявляет переменную перечислимого типа why, с допустимыми значениями этой переменной lazy,hazy и crazy.
Перечисления могут неявно преобразовываться в обычные целочисленные типы, но не наоборот.
enum boolean {FALSE, TRUE} q; | |
enum signal {off, on} a = on; | //а инициализируется в on |
enum answer {no, yes, maybe = -1} b; | |
int i, j = true; | //верно true преобразуется в 1 |
a = off; | //верно |
і = а; | //верно i становится 1 |
q = а; | //неверно два различных типа |
q = (boolean)а; | //верно явное преобразование приведением |
b = (q? no: yes); | //верно ответ имеют тип enumerator |
VT_NONE – тип переменной не определен;
VT_INT – целочисленный тип;
VT_FLOAT – вещественный тип;
VT_CHAR – символьный тип.
Этого можно достичь, если type_var определить как перечисляемый тип, который задается с помощью ключевого слова enum следующим образом:
Код C++ | |||
|
При этом объявление перечисляемого типа выполняется подобно объявлению структуры или объединения:
Код C++ | |||
|
В результате для введенной переменной перечисляемого типа допустимо использование следующих операторов:
Код C++ | |||
|
Анализ последнего оператора for показывает, что значения перечисляемого типа VT_NONE,…,VT_CHAR являются числами, которые имеют свои имена. Причем, VT_NONE = 0, VT_INT = 1, …, VT_CHAR = 3. В некоторых случаях использование имен удобнее использования цифр, т.к. их запоминать и ориентироваться в них проще, чем в числах.
Перепишем пример хранения разнородной информации с использованием перечисляемого типа, получим:
Код C++ | |||
|
Из приведенного примера видно, что использование перечисляемого типа делает программу более понятной и удобной при программировании. Здесь следует отметить, что если объявлены два перечисления
Код C++ | |||
|
то числовые значения red, green, blue будут совпадать с соответствующими числовыми значениями vt_int, vt_float, vt_char. Это значит, что программный код if(clr == red) будет работать также как и if(clr == clr_red). Часто это не имеет принципиального значения, но, например, следующий оператор выдаст сообщение об ошибке:
Код C++ | |||
|
Ошибка возникнет из-за того, что значение red и значение clr_red равны одному числу – 0, а оператор switch не допускает такой ситуации. Для того чтобы избежать такой ситуации, при задании перечисляемого типа допускаются следующие варианты:
Код C++ | |||
|
В первом случае значения clr_red = 10, clr_green = 11, clr_blue = 12. Во втором - clr_red = 10, clr_green = 20, clr_blue = 30. В третьем - clr_red = 0, clr_green = 20, clr_blue = 21. Как видно из полученных значений, величины могут инициализироваться при задании перечисления, а если они не объявлены, то принимают значение на единицу больше предыдущего значения.