- •Введение
- •Соглашения о нотации
- •Часть 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
- •Управление процессами
- •Поиск и сортировка
- •Функции работы со временем
- •Функции работы со списком аргументов
- •Другие функции
Битовые поля
Битовые поля структур используются преимущественно в двух целях: для экономии памяти, поскольку позволяют плотно упаковать значения, и для организации удобного доступа к регистрам внешних устройств, в которых различные биты могут иметь самостоятельное функциональное назначение.
Объявление битового поля имеет следующий синтаксис:
<спецификация типа > [<идентификатор >]:<константное выражение >;
Битовое поле состоит из некоторого числа разрядов машинного слова. Число разрядов, т.е. размер битового поля, задается <константным виражением >. Константное выражение должно иметь неотрицательное целое значение. Это значение не может превышать числа разрядов, требуемого для представления значения специфицированного типа. Для битового поля в версия 4.0 СП MSC спецификация типа должна задавать беззнаковый целый тип (unsigned int ). Для версии 5.0 СП MSC спецификация типа может задавать как знаковый, так и беззнаковый целый тип, причем любого размера — char , int , long . Однако знаковый целый тип для битовых полей реализован лишь синтаксически, а в выражениях битовые поля участвуют как беззнаковые значения. Недопустимы массивы битовых полей, указатели на битовые поля и функции, возвращающие битовые поля. Нельзя применять к битовым полям операцию адресации (&).
<Идентификатор> именует битовое поле. Его наличие, однако, необязательно. Неименованное битовое поле означает пропуск соответствующего числа битов перед размещением следующего элемента структуры. Неименованное битовое поле, для которого указан нулевой размер, имеет специальное назначение: оно гарантирует, что память для следующей переменной в этой структуре (в том числе и для следующего битового поля) будет начинаться на границе машинного слова (int ). В версии 5.0 СП MSC выравнивание будет производиться на границу того типа, который задан для неименованного битового поля (char , int или long ).
Битовое поле не может выходить за границу ячейки объявленного для него типа. Например, битовое поле, объявленное с типом unsigned int , упаковывается либо в пространство, оставшееся в текущей ячейке unsigned int от размещения предыдущего битового поля, либо, если предыдущий элемент структуры не был битовым полем или памяти в текущей ячейке недостаточно, в новую ячейку unsigned int .
В СП ТС битовое поле может иметь либо тип unsigned int , либо тип signed int . Поля целого типа хранятся в дополнительном коде; крайний левый бит — знаковый. Например, битовое поле типа signed int размером 1 бит может только хранить значение ‑1 и 0, т.к. любое ненулевое значение будет интерпретироваться как -1.
Примеры:
/* пример 1 */
struct {
float х, у;
} complex;
/* пример 2 */
struct employee {
char name [20];
int id;
long class;
} temp;
/* пример 3 */
struct employee student, faculty, staff;
/* пример 4 */
struct sample {
char h; float *pf;
struct sample *next; )x;
/* пример 5 */
struct {
unsigned icon: 8;
unsigned color: 4;
unsigned underline: 1;
unsigned blink: 1;
} screen [25][80];
В первом примере объявляется переменная с именем complex, имеющая тип структура. Эта структура состоит из двух элементов х и у типа float . Тип структуры не поименован, поскольку тег в объявлении отсутствует.
Во втором примере объявляется переменная с именем temp, имеющая тип структура. Структура состоит из трех элементов с именами name, id и class. Элемент с именем name — это массив из 20 элементов типа char . Элементы с именами id и class — это простые переменные типа int и long соответственно. Структурный тип поименован тегом employee .
В третьем примере объявлены три переменные типа структура с именами student, faculty и staff. Объявление каждой из этих структур ссылается на структурный тип employee , определенный в предыдущем примере.
В четвертом примере объявляется переменная с именем х типа структура. Тип структуры поименован тегом sample . Первые два элемента структуры — переменная h типа char и указатель рf на значения типа float . Третий элемент с именем next объявлен как указатель на структуру того же самого типа sample .
В пятом примере объявляется двумерный массив с именем screen, элементы которого имеют структурный тип. Массив состоит из 2000 элементов. Каждый элемент — это отдельная структура, состоящая из четырех элементов — битовых полей с именами icon, color, underline и blink.