Когда я объявляю перечислимую переменную как это:
enum paint_colors { RED, GREEN, BLUE, ...} colors;
colors
полезная переменная? Если так, что я могу сделать с ним?
Заранее спасибо.
Внутри enum
обрабатывается как целое число, которое может содержать только ограниченный диапазон значений. В этом случае будут определены константы RED
, GREEN
, BLUE
, ... и будут равны 0
, 1
, 2
, ... (соответственно). Переменную цветов
можно использовать везде, где можно использовать int
. Для перебора списка цветов можно использовать такие операторы, как ++
. Единственное различие между объявлением enum paint_colors colors
и int colors
состоит в том, что перечисляемой переменной можно , если только будет назначена одна из перечисленных констант. .
Это дает вам несколько преимуществ по сравнению с использованием #define
для создания серии констант и использованием обычного int
для цветов
. Во-первых, некоторые отладчики могут обнаружить, что цветов
является перечислимым типом, и будут отображать имя перечисляемой константы вместо числового значения.
Что еще более важно, это может добавить дополнительный уровень проверки типов. Стандарт C не требует этого, но некоторые компиляторы проверяют и удостоверяются, что значения, присвоенные переменной перечислимого типа, соответствуют одной из перечисленных констант.
Мысленно это почти похоже на высказывание:
#define RED 0
#define GREEN 1
#define BLUE 2
typedef int paint_colors;
paint_colors colors;
Переменная рассматривается как int
, но явное указание ей другого типа помогает прояснить, что это за переменная и что она используется для.
Перечисление полезно, когда у вас есть заданный набор возможных значений, где каждое значение имеет значимое имя. В другом месте вы ссылаетесь на значения перечисления, а не на «магические числа», которые могут стать бессмысленными среди прочего кода.
Я считаю, что перечисления особенно полезны во время отладки. Если вы просто используете #define
для определения констант, используемых в качестве значений для некоторой переменной, отладчик покажет вам номер. С помощью enum он может показать вам имена.
И если вам нужен набор возможных значений (констант) для одной переменной, вы можете определить ее так, как вы показали.
На самом деле то, что вы там делаете, это объявление переменной в строке с остальной частью определения перечисления. Это эквивалентно:
enum paint_colors { RED, GREEN, BLUE };
enum paint_colors colors;
Часто вы увидите typedef
, связанный с определением:
typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors;
Который позволяет вам использовать перечисление больше похоже на встроенные типы:
paint_colors color;
Таким образом, ответ на ваш вопрос заключается в том, что colors
является переменной типа enum paint_colors
и может использоваться любым способом, который вы считаете подходящим для такой переменной:
colors = RED;
if (colors != GREEN)
{
colors = BLUE;
}
И так далее.
Вы можете нарисовать американские горки!
typedef struct {
Color car;
Color door_handle;
Color wheels;
} RollerCoasterColors;
int main(void) {
RollerCoasterColors roller_coaster_colors;
roller_coaster_colors.car = RED;
roller_coaster_colors.door_handle = YELLOW;
roller_coaster_colors.wheels = PURPLE;
// now paint_roller_coaster() knows what colour to paint each part!
paint_roller_coaster(roller_coaster_colors);
}