- •Введение
- •Соглашения о нотации
- •Часть 1 описание языка си элементы языка си
- •Алфавит
- •Буквы и цифры
- •Пробельные символы
- •Разделители
- •Специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Символьные константы
- •Символьные строки
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Структура программы Исходная программа
- •Исходные файлы
- •Выполнение программы
- •Время жизни и область действия
- •Пространства имен
- •Объявления
- •Базовые типы данных
- •Спецификации типов и их сокращения
- •Области значений
- •Размер памяти и область значений типов
- •Описатели Синтаксис описателей
- •Интерпретация составных описателей
- •Описатели с модификаторами
- •Интерпретация описателей с модификаторами
- •Модификаторы const и volatile
- •Модификаторы cdecl и pascal
- •Модификатор pascal
- •Модификаторы near, far, huge
- •Модификатор interrupt
- •Объявление переменных
- •Объявление простой переменной
- •Объявление переменной перечислимого типа
- •Объявление структуры
- •Битовые поля
- •Объявление объединения
- •Объявление массива
- •Объявление указателя
- •Объявление функции (прототип)
- •Список типов аргументов
- •Классы памяти
- •Объявление переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Инициализация
- •Базовые типы и указатели
- •Составные типы
- •Строковые инициализаторы
- •Объявление типа
- •Объявление тега
- •Объявление typedef
- •Абстрактные имена типов
- •Выражения Введение
- •Операнды
- •Идентификаторы
- •Константы
- •Символьные строки
- •Вызовы функций
- •Индексные выражения
- •Доступ к многомерному массиву
- •Выбор элемента
- •Операции и l-выражения
- •Скобочные выражения
- •Константные выражения
- •Операции
- •Преобразования по умолчанию
- •Унарные операции Унарный минус (-)
- •Логическое отрицание (!)
- •Адресация "&"
- •Косвенная адресация "*"
- •Операция sizeof
- •Мультипликативные операции
- •Умножение (*)
- •Деление (/)
- •Остаток от деления (%)
- •Аддитивные операции
- •Вычитание (-)
- •Адресная арифметика
- •Операции сдвига
- •Операции отношения
- •Поразрядные операции
- •Логические операции
- •Логическое и (&&)
- •Логическое или (||)
- •Операция последовательного вычисления
- •Условная операция
- •Операции присваивания
- •Операции инкремента и декремента
- •Простое присваивание
- •Составное присваивание
- •Приоритет и порядок выполнения
- •Приоритет и ассоциативность операций в языке Си
- •Побочные эффекты
- •Преобразования типов
- •Преобразования типов при присваивании
- •Преобразование знаковых целых типов
- •Преобразование беззнаковых целых типов
- •Преобразование беззнаковых целых типов
- •Преобразование указателей
- •Преобразования других типов
- •Явные преобразования типов
- •Преобразования типов при вызовах функций
- •Операторы Введение
- •Пустой оператор
- •Составной оператор
- •Оператор-выражение
- •Условный оператор if
- •Вложенность
- •Оператор пошагового цикла for
- •Оператор цикла с предусловием while
- •Оператор цикла с постусловием do
- •Оператор продолжения continue
- •Оператор-переключатель switch
- •Оператор разрыва break
- •Оператор перехода goto
- •Оператор возврата return
- •Функции Введение
- •Определение функции
- •Класс памяти
- •Модификаторы типа функции
- •Типы возвращаемых значений
- •Формальные параметры
- •Тело функции
- •Объявление функции
- •Вызов функции
- •Фактические аргументы
- •Вызов функции с переменным числом аргументов
- •Рекурсивные вызовы
- •Директивы препроцессора и указания компилятору Введение
- •Именованные константы и макроопределения
- •Директива #define
- •Склейка лексем и преобразование аргументов макроопределений
- •Директива #undef
- •Включение файлов
- •Условная компиляция
- •Директивы #if, #elif, #else, #endif
- •Директивы #ifdef и #ifndef
- •Управление нумерацией строк
- •Директива обработки ошибок
- •Пустая директива
- •Указания компилятору языка Си
- •Псевдопеременные
- •Модели памяти
- •Виды моделей
- •Малая модель
- •Средняя модель
- •Компактная модель
- •Большая модель
- •Максимальная модель
- •Модификация стандартной модели памяти
- •Объявление данных
- •Объявление функций
- •Модели памяти сп тс
- •Часть II
- •Краткое описание библиотеки
- •Работа с областями памяти и строками
- •Определение класса символов и преобразование символов
- •Форматные преобразования данных
- •Работа с каталогами файловой системы
- •Операции над файлами
- •Ввод и вывод
- •Функции вода/вывода высокого уровня
- •Высокоуровневое открытие файлов
- •Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
- •Управление буферизацией потоков
- •Закрытие потоков
- •Чтение и запись данных
- •Обнаружение ошибок
- •Функции вода/вывода нижнего уровня
- •Открытие файлов
- •9.6.2.2. Переопределение дескрипторов (handle)
- •Чтение и запись данных
- •Закрытие файлов
- •Функции вода/вывода с консольного терминала и порта
- •Математические функции
- •Динамическое распределение памяти
- •Использование системных вызовов операционной системы ms-dos
- •Управление процессами
- •Поиск и сортировка
- •Функции работы со временем
- •Функции работы со списком аргументов
- •Другие функции
Объявление переменной перечислимого типа
Синтаксис:
enum [< тег > ]{< список-перечисления > } < описатель >[ ,<описатель >…];
enum <тег > <идентификатор > [<идентификатор >…];
Объявление переменной перечислимого типа задает имя переменной и определяет список именованных констант, называемый списком перечисления. Каждому элементу списка перечисления ставится в соответствие целое число. Переменная перечислимого типа может принимать только значения из своего списка перечисления. Элементы списка имеют тип int . Поэтому переменной перечислимого типа выделяется ячейка памяти, необходимая для размещения значения типа int . Перечислимый тип, таким образом, представляет собой подмножество целого типа. Над объектами перечислимого типа определены те же операции, что и над объектами целого типа.
<Описатель > специфицирует либо переменную перечислимого типа, либо указатель на значение перечислимого типа, либо массив элементов перечислимого типа, либо функцию, возвращающую значение перечислимого типа, либо более сложный объект, являющийся комбинацией перечисленных типов.
Объявление переменной перечислимого типа начинается с ключевого слова enum и имеет две формы представления.
В первой форме задается список перечисления, содержащий именованные константы. Необязательный <тег > — это идентификатор, который именует перечислимый тип, специфицированный данным списком перечисления, <идентификатор > — это имя переменной перечислимого типа. В одном объявлении может быть описано более одной переменной данного перечислимого типа.
Во второй форме объявления список перечисления отсутствует, однако используется <тег >, который ссылается на перечислимый тип, объявленный в другом месте программы. Если заданный тег ссылается на неизвестный перечислимый тип либо область действия определения этого перечислимого типа не распространяется на текущий блок, то компилятор языка Си сообщает об ошибке. Допускаются объявление указателя на перечислимый тип и объявление typedef для перечислимого типа, использующие тег ранее не определенного перечислимого типа. Однако этот тип должен быть определен к моменту использования этого тега или типа, объявленного посредством typedef .
<Список-перечисления > содержит одну или более конструкций вида:
<идентификатор > [=<константное-выражение >]
Конструкции в списке разделяются запятыми. Каждый <идентификатор> именует элемент списка перечисления. По умолчанию, если не задано <константное-выражение >, первому элементу присваивается значение 0, следующему элементу—значение 1 и т. д. Элемент списка перечисления является константой.
Запись =<константное-выражение > изменяет умалчиваемую последовательность значений. Элемент, идентификатор которого предшествует записи =<константное-выражение >, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным. Следующий элемент списка получает значение, равное <константное-выражение >+1, если только его значение не задается явно другим константным выражением.
В списке перечисления могут содержаться элементы, которым сопоставлены одинаковые значения, однако каждый идентификатор в списке должен быть уникальным. Например, двум различным идентификаторам null и zero может быть задано значение 0 в одном и том же списке перечисления. Кроме того, идентификатор элемента списка перечисления должен быть отличным от идентификаторов элементов всех остальных списков перечислений с той же областью действия, а также от других идентификаторов с той же областью действия (см. раздел 2.5). Тег перечислимого типа должен быть отличным от тегов других перечислимых типов, структур и объединений с той же самой областью действия.
Примеры.
/* пример 1 */
enum day {
SATURDAY,
SUNDAY = 0,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY
} workday;
/* пример 2 */
enum day today = WEDNESDAY;
В первом примере перечислимый тип определяется списком. Перечислимый тип именуется тегом day , и объявляется переменная workday этого перечислимого типа. С элементом SATURDAY по умолчанию ассоциируется значение 0. Элементу SUNDAY явно присваивается значение ноль. Остальные идентификаторы по умолчанию принимают значение от 1 до 5.
Во втором примере переменная перечислимого типа today инициализируется значением одного из элементов списка перечисления. Так как перечислимый тип с тегом day был предварительно объявлен, то при объявлении today достаточно сослаться только на тег day , не записывая повторно сам список перечисления.
Примечание. В языке Си принято записывать имена элементов перечисления прописными буквами, однако это необязательно.