Что я могу сделать с перечислимой переменной?

Когда я объявляю перечислимую переменную как это:

enum paint_colors { RED, GREEN, BLUE, ...} colors;

colors полезная переменная? Если так, что я могу сделать с ним?

Заранее спасибо.

9
задан Shog9 23 March 2010 в 19:39
поделиться

5 ответов

Внутри 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 , но явное указание ей другого типа помогает прояснить, что это за переменная и что она используется для.

10
ответ дан 4 December 2019 в 08:51
поделиться

Перечисление полезно, когда у вас есть заданный набор возможных значений, где каждое значение имеет значимое имя. В другом месте вы ссылаетесь на значения перечисления, а не на «магические числа», которые могут стать бессмысленными среди прочего кода.

0
ответ дан 4 December 2019 в 08:51
поделиться

Я считаю, что перечисления особенно полезны во время отладки. Если вы просто используете #define для определения констант, используемых в качестве значений для некоторой переменной, отладчик покажет вам номер. С помощью enum он может показать вам имена.

И если вам нужен набор возможных значений (констант) для одной переменной, вы можете определить ее так, как вы показали.

-1
ответ дан 4 December 2019 в 08:51
поделиться

На самом деле то, что вы там делаете, это объявление переменной в строке с остальной частью определения перечисления. Это эквивалентно:

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;
}

И так далее.

13
ответ дан 4 December 2019 в 08:51
поделиться

Вы можете нарисовать американские горки!

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);
}
1
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: