Тип данных enum (или перечисление) применяется чтобы дать осмысленные имена привязанные к целым числам. 1) По умолчанию элементы перечисления нумеруются с нуля и каждый следующий элемент на единицу больше предыдущего.
enum {NONE, CHAR, INT}; // Анонимное перечисление NONE = 0, CHAR = 1, INT = 2
2) Если задать элементу перечисления явное значение (целочисленное), то следующие элементы будут увеличиваться на единицу.
enum {NONE = 2, CHAR, INT}; // NONE = 2, CHAR = 3, INT = 4
printf("%d ", CHAR); // Выведет 3
3) Элементы перечисления могут иметь отрицательные значения.
enum {NONE = -3, CHAR, INT}; // NONE = -3, CHAR = -2, INT = -1
4) Элементы перечисления могут иметь одинаковые целочисленные значения и их значения могут идти не по порядку (при явной инициализации элементов).
enum {NONE = 3, CHAR, INT = 2, FLOAT, DOUBLE}; // NONE = 3, CHAR = 4, INT = 2, FLOAT = 3, DOUBLE = 4
5) Перечисление может иметь имя и тогда можно создавать элементы перечисления.
enum TYPE{NONE = 2, CHAR, INT}; // NONE = 0, CHAR = 1, INT = 2
enum TYPE a = CHAR; // a = 3
6) Можно сразу создать элемент перечисления указав имя (имена) после фигурных скобок.
enum TYPE{NONE = 2, CHAR, INT}type_sample; // NONE = 0, CHAR = 1, INT = 2, type_sample = 0
type_sample = CHAR; // type_sample = 3
printf("%d ", type_sample); // Выведет 3