Програмування в c builder
2. Тип перерахування
Перерахування описується зі службовим словом enum і розділеним комами списком елементів перерахування:
За замовчуванням першому елементу перерахування присвоюється значення 0. Кожному подальшого елементу перерахування присвоюється значення на 1 більше, ніж значення попереднього елемента. Так в попередньому прикладі false = 0, true = 1.
Значення можна явно привласнити елементу перерахування:
enum (two = 2, three, four, ten = 10. eleven, fifty = ten + 40>;
Константі two присвоюється значення 2, констант three і four присвоюються значення 3 і 4, константі eleven - 11.
Імена перераховуються констант повинні бути унікальними, а значення можуть збігатися. Перевага застосування перерахування перед описом іменованих констант і директивою # define полягає в тому, що пов'язані константи наочніше; крім того, компілятор при ініціалізації констант може виконувати перевірку типів.
При виконанні арифметичних операцій перерахування перетворюються в цілі. Оскільки перерахування є типами, обумовленими користувачем, для них можна вводити власні операції, використовуючи перевантаження операцій.
Діапазон значень перерахування визначається кількістю біт, необхідне для подання всіх його значень. Будь-яке значення цілочисельного типу можна явно привести до типу перерахування, але при виході за межі його діапазону результат не визначений.
Перерахування може мати ім'я. Кожне пойменоване перерахування описує унікальний тип і може використовуватися як специфікація типу для опису ідентифікаторів:
В операторі enum після закриває фігурної дужки можна відразу оголосити кілька змінних даного типу:
Потрібно мати на увазі, що ім'я-етикетка не є справжнім ім'ям типу. Іменем типу буде в наведеному вище прикладі enum Status. Відповідно змінні повинні оголошуватися як
enum Status ProclStatus. Proc 2 Status;
Однак завжди можна скористатися ключовим словом typedef і ввести для перерахування справжнє нове ім'я. Зазвичай це робиться відразу:
typedef enum ім'я-етикетка імя_тіпа;
typedef enum _Status
Error = -1> Status;
Тоді Status буде повноцінним ім'ям перечислимого типу. (Зверніть увагу, що для етикетки ми вказали ім'я _Status. Це звичайна практика.)
Змінні, що мають тип перерахування можуть набувати значень тільки елементів перерахування. При спробі привласнити їм інші значення, компілятор видасть повідомлення. приклад:
Status Psk = Success;
Status Psk = 1; // помилка