Програмування в 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; // помилка