Перечисления представляют типы данных, которые содержат набор констант, и каждой константе сопоставлено определенное числовое значение. Перечисление определяется с помощью ключевого слова enum:
enum название_перечисление { константа1, константа2, ... константаN };
После слова enum идет название перечисления, затем в фигурных скобках перечисляются константы перечисления.
Определим и используем простейшее перечисление:
#include <stdio.h> enum operation // арифметическая операция { ADD, // сложение SUBTRACT, // вычитание MULTIPLY // умножение }; int main(void) { enum operation op; // определяем переменную перечисления op = ADD; // присваиваем ей одну из констант перечисления printf("Operation: %d\n", op); return 0; }
Здесь определено перечисление, которое называется operation
и которое условно представляет математическую операцию.
Оно определяет три константы: ADD, SUBTRACT и MULTIPLY.
В функции main определяем переменную перечисления:
enum operation op
Этой переменной можно присвоить одну из констант перечисления. В данном случае присваиваем константу ADD
:
op = ADD;
Далее мы можем использовать эту константу. В данном случае просто выводим ее значение на консоль как число. И в реальности каждой константе будет присваиваться числовое значение: первой константе - число 0, второй константе - число 1, третей - 2 и так далее. Поэтому здесь консольный вывод будет следующим:
Operation: 0
Значение константы также можно присвоить числовой переменной:
enum operation op = MULTIPLY; int opCode = op; printf("Operation Code: %d\n", opCode); // Operation Code: 2
Также можно явным образом присвоить константам числовые значения, если нам не устраивают значения по умолчанию. Можно указать значение для первой константы, тогда все последующие будут получть значение на единицу больше:
enum operation { ADD = 5, SUBTRACT, // 6 MULTIPLY // 7 };
Можно присвоить всем уникальные значения:
enum operation { ADD = 1, SUBTRACT = 2, MULTIPLY = 4 };
Нередко константы перечисления выступают в качестве набора состояний, и в зависимости от состояния программа выполняет ту или иную логику. Например:
#include <stdio.h> enum operation // арифметическая операция { ADD = 1, // сложение SUBTRACT = 2, // вычитание MULTIPLY = 4 // умножение }; int calculate(int x, int y, enum operation op) { switch(op) { case ADD: return x + y; case SUBTRACT: return x - y; case MULTIPLY: return x * y; default: return 0; } } int main(void) { enum operation op = MULTIPLY; int result = calculate(4, 3, op); printf("Result: %d\n", result); // Result: 12 result = calculate(4, 3, ADD); printf("Result: %d\n", result); // Result: 7 result = calculate(4, 3, SUBTRACT); printf("Result: %d\n", result); // Result: 1 return 0; }
Здесь определена функция calculate()
, которая выполняет арифметическую операцию. Первая два параметра функции представляют два числа, над которыми выполняется
операция. А третий параметр - значение перечисления operation представляет тип операции. В самой функции в зависимости от третьего параметра выполняем ту или иную операцию и возвращаем ее результат.
В функции main три раза вызываем функцию calculate с одиними и теми числами, но разными типами операций.
Конечно, мы могли бы обоитись и без перечислений, используя обычные числа. Но, во-первых, перечисления представляют для своих констант описательные имена, которые часто говорят сами за себя, например, ADD(сложение). Во-вторых, в случаем с перечислением мы имеем дело с ограниченным набором констант, которыми проще управлять, нежели разрознеными числами.