Значения enum по умолчанию в C одинаковы для всех компиляторов? - PullRequest
102 голосов
/ 22 июня 2011

При объявлении перечисления, как показано ниже, все ли компиляторы C устанавливают значения по умолчанию как x=0, y=1 и z=2 в системах Linux и Windows?

typedef enum {
    x,
    y,
    z
} someName;

Ответы [ 4 ]

105 голосов
/ 22 июня 2011

Да. Если в определении перечисления не указано иное, начальный перечислитель всегда имеет значение ноль, а значение каждого последующего перечислителя на единицу больше, чем предыдущий перечислитель.

65 голосов

C99 Standard

N1265 C99 черновик говорит в 6.7.2.2/3 "Спецификаторы перечисления"

Перечислитель с = определяет свою константу перечисления как значение выражения константы. Если первый перечислитель не имеет =, значение его константы перечисления равно 0. Каждый последующий перечислитель с no = определяет его константу перечисления как значение выражения константы, полученного добавлением 1 к значению предыдущей константы перечисления. (Использование перечислителей с = может создать константы перечисления со значениями, которые дублируют другие значения в том же перечислении.)

Таким образом, в соответствующих реализациях всегда выполняется следующее:

main.c

#include <assert.h>
#include <limits.h>

enum E {
    E0,
    E1,
    E2 = 3,
    E3 = 3,
    E4,
    E5 = INT_MAX,
#if 0
    /* error: overflow in enumeration values */
    E6,
#endif
};

int main(void) {
    /* If unspecified, the first is 0. */
    assert(E0 == 0);
    assert(E1 == 1);
    /* Repeated number, no problem. */
    assert(E2 == 3);
    assert(E3 == 3);
    /* Continue from the last one. */
    assert(E4 == 4);
    assert(E5 == INT_MAX);
    return 0;
}

Скомпилируйте и запустите:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Протестировано в Ubuntu 16.04, GCC 6.4.0.

3 голосов
/ 19 июня 2018

Если первое значение переменной enum не инициализировано, то компилятор C автоматически присваивает значение 0. Компилятор продолжает увеличивать значение предыдущей переменной enum на 1.

Например:

enum months{jan,feb,mar}

Объяснение: Значение jan будет 0, фев будет 1, март будет 2.

enum months{jan=123,feb=999,mar}

Объяснение: Значение jan будет 123, фев будет 999, март будет1000.

enum months{jan='a',feb='s',mar}

Пояснение: значение jan будет 'a', feb будет 's', mar будет 't'.

0 голосов
/ 02 июня 2016

Да, значение enum по умолчанию начинается с 0 по n-й элемент для любой платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...