Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив WinRAR / 2_Посібник_С_002.doc
Скачиваний:
39
Добавлен:
17.05.2015
Размер:
2.7 Mб
Скачать
    1. 7.4Перераховуваний тип (Enum)

Enum (перерахування) – тип даних що має обмежений список ідентифікаторів.

Кожному значенню відповідає власне ім'я-ідентифікатор і ціле число, значення цього імені.

Синтаксис визначення перерахувань:

            1. enum <ідентифікатор типу>

            2. {

            3. <список перерахування>

            4. };

Тут ідентифікатор типу задає ім'я перераховуваного типу. Список перерахування складається з імен, розділених комами. Кожне ім’я задається ідентифікатором значення і, можливо, цілим значенням типу char чи int.

Приклад **1.Визначення перерахувань.

            1. Enum dataType

            2. {

            3. DT_INT, /* 0 */

            4. DT_CHAR, /* 1 */

            5. DT_STRING=3, /* 3 */

            6. DT_FLOAT, /* 4 */

            7. DT_BYTE=8, /* 8 */

            8. DT_SHORT, /* 9 */

            9. DT_POINTER /* 10 */

            10. };

Коли не вказано значення ідентифікатора, воно буде на одиницю більшим за значення попереднього ідентифікатора. Значення за замовчанням для першого ідентифікатора у списку перерахування нуль.

Для зберігання значень змінних перерахування використовується тип int.

Перерахування зручно використовувати для запобігання появ у коді програми числових літералів, логічне значення яких може бути незрозуміле читачеві. Також перерахування це більш безпечна заміна макровизначенням #define.

Синтаксис оголошення змінної типу перерахування:

            1. enum < ідентифікатор типу перерахування> < ім’я змінної>;

Приклад **2.Використання перерахувань.

            1. #include <stdio.h>

            2. #include <stdlib.h>

            3. Enum day

            4. {

            5. Sunday,

            6. Monday,

            7. Tuesday,

            8. Wednesday,

            9. Thursday,

            10. Friday,

            11. Saturday

            12. };

            13. void prn_day(enum day d) /* перерахування як аргумент функції */

            14. {

            15. static char week[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

            16. printf("%s\n",week[d]); /* d приводиться до типу int */

            17. }

            18. int main(void)

            19. {

            20. enum day cnt; /* оголошення змінної типу перерахування */

            21. for(cnt=Sunday;cnt<Saturday;++cnt)

            22. prn_day(cnt);

            23. system("PAUSE");

            24. return 0;

            25. }

Результат роботи програми:

Областю видимості типу перерахування є програмний блок, в якому було визначено перерахування. Область видимості може бут глобальною.

Визначення перерахувань може не містити імені. Доступ до елементів перерахування можливо здійснювати без оголошення змінної типу перерахування.

Приклад **3.Доступ до елементів неіменованого перерахування.

            1. #include <stdio.h>

            2. #include <stdlib.h>

            3. enum

            4. {

            5. Sunday,

            6. Monday,

            7. Tuesday,

            8. Wednesday,

            9. Thursday,

            10. Friday,

            11. Saturday

            12. };

            13. void prn_day(int d)

            14. {

            15. static char week[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

            16. printf("%s\n",week[d]);

            17. }

            18. int main(void)

            19. {

            20. int i;

            21. for(i=Sunday;i<Saturday;++i)

            22. prn_day(i);

            23. system("PAUSE");

            24. return 0;

            25. }

Програма приведена у прикладі **3 працює аналогічно програмі з прикладу **2. Відмінність становить метод використання перерахувань. Якщо у прикладі **2 перерахування використовувалось як власний тип даних, що підкреслював логічну структуру програми, то у прикладі **3 перерахування служить тільки для введення іменованих констант. Таке використання перерахувань аналогічне введеню макровизначень за допомогою директиви препроцесора #define.

Приклад **3 показує загальнодоступність ідентифікаторів значень списку перерахування. Це в свою чергу означає що два різних визначення перераховувального типу в одному програмному блоці не можуть мати ідентифікаторів значень з однаковими іменами, навіть якщо їм присвоєно однакові значення.

Соседние файлы в папке Архив WinRAR