В чем разница между этими двумя объявлениями enum - C? - PullRequest
1 голос
/ 18 февраля 2011

Я начал изучать C и достиг точки перечисления.Перечисление в основном является предпочтительной альтернативой DEFINE / const int, верно?

В чем разница между этими двумя объявлениями?

#include <stdio.h>

// method 1
enum days {
    Monday,
    Tuesday
};

int main()
{
    // method 1
    enum days today;
    enum days tomorrow;

    today    = Monday;
    tomorrow = Tuesday;

    if (today < tomorrow)
        printf("yes\n");

    // method 2
    enum {Monday, Tuesday} days;

    days = Tuesday;
    printf("%d\n", days);

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Перечисление должно быть предпочтительнее, чем #define / const int, если вы хотите объявить переменные, которые могут принимать значения только из ограниченного диапазона связанных , взаимоисключающих ценности.Таким образом, дни недели - это хороший пример, но это будет плохой пример:

enum AboutMe
{
    myAge = 27,
    myNumberOfLegs = 2,
    myHouseNumber = 54
};

Возвращаясь к вашему примеру с кодом;первый метод объявляет тип с именем enum days.Вы можете использовать этот тип, чтобы объявить столько переменных, сколько хотите.

Второй метод объявляет одну переменную типа enum { ... }.Вы не можете объявлять любые другие переменные этого типа.

1 голос
/ 18 февраля 2011

Будучи опечаткой, я написал бы первое как

typedef enum { Monday, Tuesday } days_t;

и объявил бы как

days_t day = Tuesday;

Второй метод, который я не нашел применения.

0 голосов
/ 18 февраля 2011

Разница в том, что в первом случае дни - это имя перечисления.Поэтому вы можете получить доступ к определению с помощью

enum days today;

enum days = ясно, какое перечисление, то, которое названо days

today = имя переменной

Во втором случае, days - это переменная безымянного перечисления.

enum {Monday, Tuesday} days;

enum {Monday, Tuesday} = неназванное перечисление, поэтому должно быть определено в квадратных скобках {}

days = имя переменной

...