Тип данных 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 = 2, CHAR = 3, INT = 4
enum TYPE a = CHAR; // a = 3
printf("NONE = %d, CHAR=%d, INT=%d, a=%d", NONE, CHAR, INT, a); // NONE = 2, CHAR=3, INT=4, a=3
6) Можно сразу создать элемент перечисления указав имя (имена) после фигурных скобок.
enum TYPE{NONE = 2, CHAR, INT}type_sample; // NONE = 2, CHAR = 3, INT = 4, type_sample = неопределенное значение
type_sample = CHAR; // type_sample = 3
printf("NONE = %d, CHAR=%d, INT=%d, type_sample=%d", NONE, CHAR, INT, type_sample); // NONE = 2, CHAR=3, INT=4, type_sample=3