Перечисления в С (enum)





перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

Перечисления (enum) используются в C для создания констант. Припустимо треба оголосити константи для музичних нот і кожну форматувати відповідним порядковим номером. Можно воспользоваться уже знакомым нам способом:

перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

Таке оголошення займає багато рядків коду і не зовсім зручно. Используя перечисление, можно определить эти константы иным способом. Синтаксис enum похож на синтаксис структур: ключевое слово – дескриптор – елементи в фігурних дужках через кому :

перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

Это полная форма – с дескриптором (именем перечисления). Как и в случае со структурами, имя перечисления можно не использовать:

перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

В первом случае – ми зможемо створювати змінні типу перерахування notes. Во втором случае – нет.

Зверніть увагу, что значение 1 было присвоено только первому элементу перечисления. По умолчанию первому элементу в фигурных скобках присваиваются значение 0, второму на единицу больше (1), третьему на единицу больше второго (2) і т.д. Но если явно задать значение, как в примере, то увеличение на единицу начнется с этого числа. Покажем на экран значения некоторых элементов перечисления.

В консоли отобразится:перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

Хоть мы и не присваивали явно значения RE і SOL – они хранят правильные порядковые номера нот.

Имена перечислителей (элементов перечисления) должны быть уникальными. Значения же могут совпадать:

Значение 1 зберігатимуть KLICHKO_VITALIY і KLICHKO_VLADIMIR. 2 запишется в CHISORA, 3 – в ADAMEK . В элементы перечисления могут быть записаны только целые числа. Изменить ниже в программе значения, которые присвоены элементам в фигурных скобках нельзя. Если создается переменная типа перечисления – она может принять значение только одного из своих элементов:

перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

На картинке видно, что записать число в переменную типа champions возможности нет. Можно записать только именованную константу, которая объявлена во время определения enum.

Для закрепления рассмотрим пример. У ньому створимо перерахування levelsName. Оно будет содержать шесть элементов – “названия” этажей. користувачеві запропонуємо “покататься” на лифте.

Объявляем целочисленную переменную floor в строке 10 і инициализируем її іменованою константою parking. Так floor примет значение 0. В рядку 13 входим в цикл while. Поки користувач не введе в змінну exitOrNot значение 0, программа будет ему предлагать “кататься на лифте” – выбрать номер этажа. После каждого выбора этажа звучит сигнал (три коротких гудка) і на екран виводиться номер поверху і інформація про те, что на нём размещено. Это реализовано оператором вибору switch. його блоки case перебирают элементы перечисления. То есть пользователь вводит целое число, а case ищет, какому из элементов перечисления оно соответствует. Наприклад, если введено 5 – це відповідає значенню елемента Restaurant – на екран виводиться відповідне повідомлення.

Результат:

перечисления с  , перечисления c  , Перерахування C ++, перерахування C ++

Посмотрите короткое видео о перечислениях C . Оно на английском языке, но понять его легко, после прочтения статьи:

Щоб підтримати наш сайт – натисніть на скарбничку і виберіть будь-який зручний спосіб.

Нові уроки з програмування:

Перечисления в С (enum)
5 (100%) 2 голосів

6 думки про "Перечисления в С (enum)

  1. нормальні приклади, а статтю не читав.

    Я сформулюю, а ти поправ ласка, якщо до статті я розійдуся в чомусь.

    1) магічні числа – це погано, щоб позбутися від них використовують константи.

    2) константи – це добре, але константи сильно пов'язані один з одним.

    Приклад: в програмі у нас є юніт. Юніт може бути магом, гоблином або ельфом. Одним з варіантів реалізації цього могло бути щось таке:

    Const INT Mag = 1;
    Const INT Гоблін = 2;
    Const INT Elf = 3;

    структура Unit {
    ім'я рядка;
    INT UNIT_TYPE;
    };

    очевидно, це погано, тому що:
    2.1) константи Mag, гоблін, Elf доступні всім, т.е. засмічують простір імен;
    2.2) константи можуть бути випадково використані в неправильному контексті, адже вони не згруповані, т.е. нічим не відрізняються від інших констант;
    2.3) полю unit_type можна привласнити неправильне значення (компілятор повідомить нам про помилку) :
    unit.unit_type = -123;
    2.4) нам треба придумувати самим значення констант і стежити щоб вони не повторювалися.

    Всі ці проблему еротично вирішує enum:

    перелічувальний UnitType { магнітний, гоблін, ельф };
    структура Unit {
    Тип UNIT_TYPE;
    ім'я рядка;
    };

    звернутися до констант ми можемо як безпосередньо (магнітний) так і по імені перерахування (UNITTYPE::магнітний). Другий варіант позначає явно контекст, але начебто з'явився в С ++ 11 (раніше його підтримувала більшість компіляторів, але стандарту ніби як воно не відповідало).

    unit.unit_type = 123;
    завершиться помилкою на етапі компіляції (т.е. дуже рано). А якщо ви юзаєте сучасну IDE – то ще раніше (середовище розробки підкреслить помилку).

    Ну і значення їм присвоєні автоматично, стежити за цим не треба.

    Код можна зробити трохи красивіше:
    структура Unit {
    Тип іпіт {магнітний, гоблін, ельф} тип;
    ім'я рядка;
    };

    Це може бути краще, т.к. видно, що Unit і Type нерозривно пов'язані (раніше ми кодували це в імені UnitType). Кодувати щось в імені не дуже добре, наприклад якби Unit перейменували б в Item – то нам довелося б перейменовувати ItemType, або зв'язок стала б не очевидна.
    блок::тип::Mag лаконічно задає контекст, в якому може використовуватися константа.

  2. Мій варіант вирішення завдання з прикладу:
    попередньо клас =”тільки:C ++ декодуванням:true ”

    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);
    перерахувань lewels {undParking = -1, oneFloor = 1, secondFloor = 2, ресторан = 3, Пентхаус = 4};
    INT ліфт = 0;
    int exit = 1;
    cout <<"Вы зашли в здание и сейчас находитесь на " << oneFloor << " этаже \n";
    do
    {
    cout <> ліфт;
    switch (ліфт)
    {
    case(undParking):
    cout << "Вы попали в подземную автостоянку \n";
    break;
    case(oneFloor):
    cout << "Вы на первом этаже \n";
    cout <> exit;
    if (exit == 0)
    {
    cout << "Вы вышли из здания \n";
    }
    break;
    case(другий поверх):
    cout << "Вы на втором этаже \n";
    break;
    case(Restaurant):
    cout << "Вы в ресторане \n";
    break;
    case(пентхауз):
    cout << "Вы в пентхаусе \n";
    break;
    default:
    cout << "Нет такого этажа \n";
    }
    } while (exit == 1);
    return 0;
    }

    /заздалегідь

  3. Перерахування в мові C ++ прямо успадковують поведінка перерахувань мови C, за винятком того, що перераховується тип в C ++ - справжній тип, і ключове слово

    1. Цитата з опису мов C і C ++:
      > У версії С89 визначено 32 ключових слова.
      > …
      > enum - Призначений для користувача тип даних “перераховується тип”
      > …
      > У мові C ++ містяться всі ключові слова, визначені в версії С89, а також такі.

      І де тут відмінність?

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *