Что я могу сделать с переменной enum? - PullRequest
9 голосов
/ 23 марта 2010

Когда я объявляю переменную enum следующим образом:

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

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

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

Ответы [ 7 ]

13 голосов
/ 23 марта 2010

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

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

и т. Д.

10 голосов
/ 23 марта 2010

Внутренне, enum рассматривается как целое число, которое может содержать только ограниченный диапазон значений. В этом случае константы RED, GREEN, BLUE, ... будут определены и будут равны 0, 1, 2, ... (соответственно). Переменная colors может использоваться везде, где может использоваться int. Вы можете использовать операторы, такие как ++, чтобы перебрать список цветов. Единственная разница между объявлением enum paint_colors colors и int colors заключается в том, что перечисляемой переменной может должна только быть присвоена одна из перечисленных констант.

Это дает вам несколько преимуществ по сравнению с использованием #define для создания серии констант и использованием обычного int для colors. Во-первых, некоторые отладчики могут обнаружить, что colors является перечислимым типом, и вместо числового значения будет отображаться имя перечисляемой константы.

Что еще более важно, это может добавить дополнительный уровень проверки типа. Это не требуется стандартом C, но некоторые компиляторы проверяют и удостоверяются, что значения, присвоенные переменной перечислимого типа, соответствуют одной из перечислимых констант.

Мысленно, вы можете почти думать об этом, как сказать:

#define RED    0
#define GREEN  1
#define BLUE   2
typedef int paint_colors;
paint_colors colors;

Переменная обрабатывается как int, но явное присвоение ей другого типа помогает уточнить, что это за переменная и для чего она используется.

1 голос
/ 19 июня 2014

В C переменная типа enum может повторяться, например, ++, +; Но это не разрешено в C ++;

enum WEEKDAY {MON, TUE, WED, THU, FRI, SAT, SUN, END};
for(WEEKDAY day = 0; day < END; day++){
    printf("day index = %d\n", day);
}

может быть скомпилировано в C, но не в C ++;

1 голос
/ 23 марта 2010

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

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);
}
0 голосов
/ 26 января 2019
enum paint_colors { RED, GREEN, BLUE, ...} colors;

Это объявление типа перечисления, которое вы сделали.Отвечая конкретно на ваш вопрос, вы можете объявить переменную int как обычно,

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

и выполнить все операции с переменной colors так же, как вы делали бы это с вашим объявлением.Это не будет иметь никакого значения в операционной части.Будь то присвоение целочисленного значения за пределами константного значения перечислителя,

colors=1676;    //Valid in both of our case

Единственное отличие, которое он делает, - это сделать код более читабельным и более понятным, потому что переменная типа enum указывает ее назначение для программиста (особенно отладчика),Зависит от тебя;)

0 голосов
/ 23 марта 2010

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

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

0 голосов
/ 23 марта 2010

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

...