Рубрики: КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

про компютерное железо, документация, языки программирования

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

Если опция выравнивания включена, топриведенный пример
структуры имел бы добавленный перед double байт, и весь объ-
ект в целом занимал бы 32 байта.

Пространство имен структур

Имена тегов структур разделяют общее пространство имен
стегами объединений и перечислимых данных (однако в С++ име-
на входящих в структуру перечислимых данных находятсяв дру-
гом адресном пространстве). Это означает, что в пределах од-
ного контекста такие теги должны иметь уникальные имена.
Однако, имена тегов не обязаны отличаться от идентификато-
ров, находящихся в трех других адресных пространствах:
пространстве имен меток, пространстве (пространствах) имен
компонентов и едином адресном пространстве (которое состоит
из имен переменных, функций, имен typedef и нкмераторов).

Имена компонентов в пределах данной структуры или объ-
единения лбязаны быть уникальными, но среди разных структур
или объединений они могут совпадать. Например,

goto s;

struct s (* // так можно; теги и имена меток находятся
в разных // адресных пространствах
int s; // так можно; теги, имена меток и имена компо-
нентов // дятся в разных адресных пространствах
float s;// так нельзя: повторение имени компонентов
структур *) s; // так можно; пространства имен переменных
различны // В С++ это допустимо только если s не имеет
// конструктора.

union s (* // так нельзя: повторение имен в пространс-
тве тегов int s; // так можно: новое пространство компонен-
тов float f;
*) f; // так можно: пространство имен переменных

struct t (*
int s; // так можно: следующее пространство имен компо-
ненто

*) s; // так нельзя: повторение имен переменных

Неполные объявления

Указатель структуры типа А допустим в объявлении другой
структуры В до объявления структуры А:

struct A;// неполное объявление struct B (* struct A
*pa *);
struct A (* struct B *pb *);

Первое объявление А называется неполным, поскольку в
этой точке отсутствует определение А. В данной ситуации не-
полное объявление допустимо, поскольку в объявлении В размер
А необязателен. Битовые поля

— 67 —
Структура можетсодержать любые комбинации битовых полей
с данными других типов.

Целочисленные компоненты типа signed или unsigned можно
объявить битовыми полями шириной от 1 до 16 бит. Ширина би-
тового поля и его опциональный идентификатор задаются следу-
ющим образом:

спецификатор-типа :ширина;

где спецификатор-типа это char, unsigned char, int или
unsigned int. Битовые поля располагаются с нижнего и кончая
саршим битом слова. Выражение «ширина» должно быть задано и
должно давать целочисленную константу со значением в диапа-
зоне от 0 до 16.

Если идентификатор битового поля опущен, то число би-
тов, заданное выражением «ширина», распределяется в памяти,
но поле при этом остается недоступным программе. Это позво-
ляет создавать битовые шаблоны для, например, аппаратных ре-
гистров компьютера, в которых некоторые биты не используют-
ся. Пример:

struct mystruct (*
int i:2;
unsigned j:5;
int :4;
int k:1;
unsigned m:4;
*) a, b, c;

создает следующее распределение памяти.

————————————————————
\! 15\! 14\! 13\! 12\! 11\! 10\! 9 \! 8 \! 7 \! 6 \! 5
\! 4 \! 3 \! 2 \! 1 \! 0 \!
————————————————————
\! x \! x \! x \! x \! x \! x \! x \! x \! x \! x \! x

\! x \! x \! x \! x \! x \!
————————————————————
\!\!\!\!\!\!
————————————————————
\! m \! k \!не используется\! j \! i \!
————————————————————

Целочисленные поля хранятся в виде дополнения до двух,
причем крайний левый бит побещается в MSB (наиболее значащий
бит).Для битового поля типа Int (например, signed) MSB ин-
терпретируется как знаковый бит. Битовое поле шириной 2, со-
держащее двоичное 11, будет, следовательно, в случае типа
unsigned интерпретироватьсякак 3, а в случае Int как -1. В
предыдущем примере допустимое выражение a.i = 6 поместит в
a.i двоичное 10 = -2, не выдавая каких-либо предупреждений.
Поле k типа signed int шириной 1 может содержать только зна-
чения -1 и 0, так как битовый шаблон 1 будет интерпретирован
как -1.

Примечание

Битовые поля могут быть объявлены только в структурах,
объединениях и классах. Доступ к ним выполняется теми жесе-
лекторами компонентов (. и ->), что используются для доступа
к компонентам других типов. Кроме того, битовые поля вызыва-
ют некоторые проблемы с созданием переносимых кодов, пос-
кольку организация битов в байтах и байтов в словах зависит
от конкретной машины.

— 68 —

Выражение &mystruct.x недопустимо, так как x это иден-
тификатор битового поля, а никакой гарантии, что mystruct.x
имеет адрес на границе байта, нет.

Объединения

Объединения соответствуют типам вариантных записей язы-
ков Pascal и Modula-2.

Типы объединений являются производными типами, разделя-
ющими многие синтаксические и функциональные свойства типов
структур. Главное отличие между ними состоит в том, что объ-
единение позволяет быть «активным» одновременно только одно-
му компоненту. Размер объединения равен таким образом разме-
ру своего максимального компонента. Одновременно в памяти
может находиться значение только одного компонента лобъеди-
нения. В следующем простом случае

union myunion (* /* тег объединения = myunion */
int i;
double d;
char ch;
*) mu, *muptr=μ

идентификатор mu типа union myunion может служить для
хранения 2-байтового значения int, 8-байтового значения
double или 1-байтового char, но одновременно — только одного
из этих значений.

Обе операции sizeof(union myunion) и sizeof (mu) возв-
ращают значение 8, но когда mu содержит объект типа int, то
6 байт остаются неиспользованными (туда помещаются симво-
лы-заполнители), а когда mu сщдержит объект типа char — то 7
байт. Доступ к компонентам объединения выполняетсяпри помощи
селекторов компонента структуры (. и ->), но требуется соб-
людать осторожность:

mu.d = 4.016;
printf(«mu.d = %f\n»,mu.d);// порядок: на дисплее mu.d
= 4.016
printf(«mu.i = %f\n»,mu.i);// забавный результат !
mu.ср = ‘A’;
printf(«mu.ch = %c\n»,mu.ch); // порядок: на дисплее
mu.ch = A
printf(«mu.d = %f\n»,mu.d); // забавный результат !
muptr->i = 3; printf(«mu.i = %d\n»,mu.i); // порядок: на
дисплее mu.i = 3

Второй оператор printf допустим, поскольку mu.i цело-
численного типа. Однако, битовая комбинация в mu.i соответс-
твует части ранее присвоенного значения типа double и не
даст как правило полезной целочисленной интерпретации.

При правильных преобразованиях указатель объединения
может указывать на любые его компоненты, и наоборот.

Объявления объединений

Общий синтаксисобъявления объединений во многом напоми-
нает синтаксис объявления структур. Различия состоят в сле-
дующем:

1. Объединения могут содержать битовые поля, но актив-
ным бывает только одно изних. Все они начинаются в начале
объединения.

— 69 —
2. С++ : В отличие от структур С++, объединения С++ не
могут использовать спецификаторы класса доступа:public,
private и protected. Все поля объединения имеют доступ

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

Расширенная память (Ext)…………………………..
Глава 5 Видео функции…………………..
Несколько слов о видео режимах……………………….
Несколько слов о текстовых и графических окнах…………
Что такое окно ? ……………………………….
Что такое графическое окно ? ……………………..
Координаты……………………………………….
Программирование в текстовом режиме…………………..
Функции консольного ввода/вывода …………………..
Текстовые окна……………………………………
Тип text_mode…………………………………….
Цвета текста ……………………………………
Высокоскоростной вывод: переменная directvideo ………
Программирование в графическом режиме…………………
Функции библиотеки graphics………………………..
Управление цветом на CGA…………………………..
Глава 6…………………………………………….
Смешанное программирование…………………………..
Последовательности передачи параметров ……………
Подготовка к вызову .ASM из Turbo C++…………………
Упрощенные сегментные директивы …………………..
Стандартные сегментные директивы …………………
Определение данных — констант и переменных ………….
Определение глобальных и внешних идентификаторов …..
Подготовка к вызову Turbo C++ из .ASM…………………

— 5 —
Ссылки к функциям…………………………………
Ссылки к данным ………………………………..
Определение подпрограмм на языке ассемблера……………
Передача параметров……………………………….
Обработка значений возврата ……………………….
Соглашения о регистрах………………………………
Вызов функций С из модулей .ASM………………………
Псевдопеременные, встраиваемые ассемблерные коды и функции
прерывания………………………………………..
Псевдопеременные ……………………………….
Встраиваемые ассемблерные коды …………………..
Функции прерывания………………………………..
Практические примеры программ низкого уровня ………
Глава 7 Сообщения об ошибках………………….
Сообщения об ошибках времени выполнения……………….
Сообщения об ошибках компилятора……………………..
Фатальные ошибки……………………………………
Ошибки…………………………………………….
Предупреждения……………………………………..
Приложение АСтандарты ANSI, зависящие от
реализации…………………………………………
.
— 6 —

Введение

Документ «Начало работы» содержит обзор всего комплекта
документации к Turbo C++. Информация о том, как с наибольшей
эффективностью использовать Руководства по Turbo C++, содер-
жится во введении и главе 2 этого документа.

Данное руководство содержит материалы для углубленного
изучения программирования и предназначено для тех, кто уже
хорошо умеет программировать (на C, либо на другом языке
программирования). Здесь содержится справочник по языку C,
перекрестные ссылки по библиотеке исполняющей системы и ин-
формациЯ по программированию с использованием потоков C++,
моделей памяти, плавающей точки, оверлеев, видео-функций,
интерфейса с языком ассемблера, а также сообщения об ошибках
исполняющей системы и компилятора.

Прочесть документ «Начало работы» следует, если:

1. Вы ранее никогда не программировали ни на одном язы-
ке.
2. Вы ранее программировали, но не на C, и желаете про-
честь введение в язык C.
3. Вам нужна информация о том, как установить на компь-
ютере Turbo C++.

В Руководстве пользователя находится информация об
интегрированной среде Turbo (включая редактор), администра-
торе управляющей системы, компиляторе командной строки, до-
полняющих Turbo C++ утилитах и макроязыке редактора Turbo.

Справочник по библиотеке содержит в алфавитном порядке
листинг функций и глобальных переменных Turbo C++.

Содержание данного руководства

Глава 1:»Стандарт языка Turbo C++» описывает язык Turbo
C++. Здесь приводятся все отличия от стандарта ANSI C. Дан-
ная глава также включает справочник по языкам C и C++.

Глава 2: «Перекрестные ссылки по библиотеке управляющей
системы» содержит информацию об исходных кодах библиотеки
исполняющей системы. Здесь также описаны файлы заголовков и
приводятся перекрестные ссылки по библиотеке управляющей
системы, организованные по субъектам библиотеки. Например,

если вы хотите выяснить, какие функции относятся к графике,
вы должны обратиться к разделу данной главы «Графика».

Глава 3:»Потоки C++» рассказывает, как использовать
библиотеку потоков C++.

Глава 4:»Модели памяти, операции с плавающей точкой и
оверлеи» рассматривает модели памяти, программирование со
смешанными моделями памяти, вычисления с плавающей точкой и
оверлеями.

Глава 5:»Видео-функции» посвящена обработке в Turbo C++
текстов и графических изображений.

Глава 6:»Интерфейс с языком ассемблера» говорит о том,
как нужно писать программы на языке ассемблера, чтобы они
правильно работали при вызове из программ на Turbo C++.

Глава 7: «Сообщения об ошибках» перечисляет и объясняет
все фатальные ошибки, ошибки и предупреждения исполняющей

— 7 —
системы и компилятора, а также дает возможные рекомендации
по их устранению.

Приложение А: «Стандарты ANSI, зависимые от реализа-
ции» описывает те аспекты стандарта ANSI C, которые были оп-
ределены с некоторой степенью свободы или не были определены
вообще в стандарте ANSI. Следовательно, эти аспекты могут
варьироваться в зависимости от конкретной реализации. Данное
приложение сообщает о том, как Turbo C++ поступает в отноше-
нии каждого из этих аспектов.

Глава 1 Стандарт языка Turbo C++

В данной главе дается подробное справочноеруководство
программиста по языку Turbo C++. Оно не является руководс-
твом по изучению языка, а скорее формальным описанием языков
C и C++ в их реализации программным продуктом Turbo C++. В
данной главе описываются грамматические правила записи
структуры фраз и лексики языка, а также дается подробное из-
ложение имеющихся директив препроцессора. При формулировке
синтаксиса используется модифицированная запись Бэкуса-Науэ-
ра,при необходимости сопровождаемая кратким описанием и при-
мерами программ.

Turbo C++ реализует стандарт ANSI C, разработанный тех-
ническим комитетом X3J11 между июнем 1983 и декабрем 1988
гг., с некоторыми расширениями, оговариваемыми вданномтекс-
те. Вы имеете возможность устанавливать опции компилятора,
которые будут предупреждать вас о том, чтотакие расширения
встретилисьпри работе компилятора. Вы можете также настроить
компилятор таким образом, чтобы он рассматривал ключевые
слова расширений Turbo C++ в качестве нормальных идентифика-
торов (см. Главу 4,»Компилятор командной строки», в Руко-
водстве пользователя).

Существуют также «согласующие» расширения, включаемые
посредством директив #pragma, предлагаемых стандартом ANSI
C, предназначенные для работы с нестандартными, зависимыми
от конкретной реализации средствами языка.

Turbo C++ является также полной реализацией AT&TC++
версии 2.00, объектно-ориентированного надмножества C, раз-
работанного Бьерном Строструпом из AT&T Bell Laboratories.
Помимо того,что C++ дополняет C многими новыми средствами и
возможностями, он также и отличен от него в большей или
меньшей степени. В настоящей главе содержатся замечания по
этим отличиям. Все средства языка Turbo C++,имеющие отклоне-
ния от C++, более подробно рассматриваются, начиная со стра-
ницы 98.

Синтаксис и терминология

Синтаксические определения состоят из имени определяе-
мого в настоящий момент и не определенного где-либо выше
термина, за которым следует двоеточие (:). Альтернативы
обычно следуют за этим в отдельных строках, но могут также
помещаться и в одной строке; в таком случае им предшествует
фраза «одно из». Например,

внешнее-определение:
определение-функции
объявление

— 8 —

восьмеричная цифра: одно из
0 1 2 3 4 5 6 7

Опциональные элементы конструкции заключаются в угловые
скобки:

целочисленный-суффикс:
суффикс-целого-без-знака

В данной главеслово «аргумент» везде используется для
обозначения действительного значения, передаваемогопри вызо-

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

список-объявления-арг, …
…(только для С++)

список-объявления-арг:
объявление-аргументов
список-объявления-арг объявление-аргументов

объявление-аргументов:
спецификаторы-объявления декларатор
спецификаторы-объявления декларатор = выражение (только
для С++)
спецификаторы-объявления
спецификаторы-объявления =вы-
ражение (только для С++)

определение-функции:
декларатор
тело-функции

тело-функции:
составной оператор

инициализатор:
= выражение
= (список-инициализаторов)
(список-выражений) (только для С++)

список-инициализаторов:
выражение
список-инициализаторов , выражение
(список-инициализаторов)
————————————————————
Внешние объявления и определения

Спецификаторы класса памяти auto и registerво внешнем
объявлении появиться не могут (см. «Единицы трансляции»).
Для каждого идентификатора в единице трансляции, объявленной
с внешним типомкомпоновки, может существовать не более одно-
го внешнего определения.

Внешнее определение — это внешнее объявление, которое
также определяет объект или функцию;таким образом, оно также
распределяет память. Если идентификатор, объявленный с внеш-
ним типомкомпоновки, используется в выражении (не являющемся
частью операции sizeof), то во всей программе должно иметь-
сяв точности одно внешнее определение данного идентификато-
ра.

Turbo C++ позволяет затем переобъявление внешних имен,
таких как массивы, структуры и объединения, добавляя инфор-
мацию к ранее выполненным объявлениям. Например,

int a[] // нет размера
struct mystruct; // только тег, без объявления компонентов

— 38 —
int a[3] = [1, 2, 3]; // задание размера и инициализация
struct mystruct (*
int i, j;
*); // добавление деклараторов компонентов

Объявления классов Turbo C++ (только С++) Таблица 1.12
————————————————————
спецификатор-класса:
заголовок-класса ()

заголовок-класса:
ключ-класса
ключ-класса имя-класса

список-компонентов:
объявление-компонента
спецификатор-доступа :

объявление-компонента:
;
определение-функции
квалифицированное-имя;

список-декларатора-компонентов:
декларатор-компонента
список-декларатора-компонентов, декларатор-компонента

декларатор-компонента:
декларатор
: выражение-типа-константы

pure-спецификатор:
=0

базовый-спецификатор:
:базовый-список

базовый-список:
базовый-спецификатор

базовый-список, базовый-спецификатор

базовый-спецификатор:
имя-класса
virtual имя-класса
спецификатор-доступа Юvirtual> имя-класса

спецификатор-доступа:
private
protected
public

имя-функции-преобразования:
operator имя-типа-преобразования

имя-типа-преобразования:
спецификация-типа

инициализатор-конструктора:
: список-инициализаторов-памяти

список-инициализаторов-памяти:
инициализатор-памяти
инициализатор-памяти, список-инициализаторов-памяти

инициализатор-памяти:
имя-класса ()
идентификатор ()

— 39 —

имя-функции-операции:
operator операция

операция: одно из
new delete sizeof

+ — * /% ^
& \! !=
+= -= *= /=%= ^=
&= \!= >>>= ()
[] .*
————————————————————

Спецификаторы типа

Спецификатор типа с одним или более опциональным моди-
фикатором используется для задания типа объявляемого иденти-
фикатора:

int i; // объявление i как целого со знаком
unsigned char ch1, ch2; // объявление двух символьных
без знака

По устоявшейся традиции, если спецификатор типа опущен,
то по умолчанию назначается тип signed int (или, что эквива-
лентно, int). Однако, в С++ встречаются ситуации, когда от-
сутствие спецификатора типа ведет к синтаксической неодноз-
начности, поэтому в практике работы с С++ используется явный
ввод всех спецификаторов типа int.

Таксономия типа

Существует четыре базовые категории типа: void, scalar,
function и aggregate. Типы scalar и aggregate могут далее
подразделяться следующим образом:

— Scalar: арифметический, перечислимый, указатель и в С
++ ссылки

— Aggregate: массив, структура, объединение и в С++ класс

Типы делятся на фундаментальные и производные. К фунда-
ментальным относятся: void, char, int, float и double сов-
местно с short, long, signed, а также некоторые варианты с
ними unsigned. Производные типы включают в себя указатели и
ссылки на другие типы,массивы других типов, типы функций,
типы классов, структуры и объединения.

С++: Объект класса может, например, содержать некоторое
число объектов различных типов вместе сфункции манипуляции
этими объектами, плюс механизм контроля доступа и наследова-
ния от других классов.

Задав не-пустойтип type (с некоторыми предосторожностя-
ми), можно объявлять производные типы следующим образом:

— 40 —

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

private.

3. Объединения инициализируются через компонент, объяв-
ленный первым

union local87 (*
int i;
double d;
*) a = (* 20*);

4. С++ : Объединение не может участвовать в иерархии
класса. Оно не может являться производным от какого-либо
класса или быть базовым классом. Объединение может иметь
конструктор.

5. С++ : Анонимные объединения не могут иметь компонен-
ты-функции.
Перечислимые данные

Тип перечислимых данных служит для обеспечения мнемони-
ческих идентификаторов набора целочисленных значений. Напри-
мер, следующее объявление:

enum days (* sun, mon, tues, wed, thur, fri, sat *)
anyday;

устанавливает уникальный интегральный тип, enum days,
переменную anyday этого типа и набор нумераторов
(sun,mon,…), которым соответствуют целочисленные констан-
ты.

Turbo C++ может хранить нумераторы в одном байте, если
это позволяет диапазон значений нумераторов, когда выключена
опция -b (по умолчанию она включена; это означает, что дан-
ные типа enum всегда int), но при использовании их в выраже-
ниях выполняется этих данных преобразования к типу int.
Идентификаторы, используемые в списке нумераторов, неявно
получают тип unsigned char или int, в зависимости от значе-
ний нумераторов. Если все значения могут быть представлены
типом unsigned char, то это и будет типом каждого нумерато-
ра.

C++ В С переменной перечислимого типа может быть прис-
воено любое значение типа int — кроме этого, никакого конт-
роля типа не выполняется. В С++ переменной перечислимого
типа может присваиваться только значение одного из ее нуме-
раторов. Таким образом,

anyday = mon; // так можно
anyday = 1; // так нельзя, даже хотя mon == 1

Идентификатор days является опциональным тегом перечис-
лимого типа,который можно использовать в последующих объяв-
лениях переменных перечислимого типа enum days:

enum days payday, holiday; // объявление двух переменных

С++ В С++ ключевое слово enum можно опустить, если в
пределах данного контекста имя days не дублируется.

Как и в случае объявлений struct и union, если далее
переменные данного типа enum не требуются, тег может быть
опущен:

— 70 —
enum (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* анонимный тип enum */

Подробное описание констант перечислимого типа см. на
стр. 17 оригинала.

Нумераторы, перечисленные внутри фигурных скобок, назы-
ваются перечислимыми константами. Каждой из них назначается
фиксированное целочисленное значение. При отсутствии явно
заданных инициализаторов первый нумератор (sun) устанавлива-
ется в ноль, а каждый последующий нумератор имеет значение
на единицу больше, чем предыдущий (mon = 1, tue = 2 и т.д.).

При наличии явных интегральных инициализаторов вы може-
те установить один или более нумераторов в конкретные значе-
ния. Любые последующие имена без инициализаторов будут
получать приращение в единицу. Например, в следующем объяв-
лении

/* выражение инициализатора может включать в себя нуме-
раторы, объявленные ранее */
enum coins (* penny = 1, tuppence, nickel = penny + 4,
dime =10, quarter = nickel * nickel *) smallchange;

tuppence примет значение 2, nickel — значение 5, а
quarter — значение 25.

Инициализатор может быть любым выражением, дающим поло-
жительное или отрицательное целочисленное значение (после,
возможно, некоторых целочисленных преобразований.) Обычно
такие значения бывают уникальными, но дублирование их также

не запрещено.

Тип enum может участвовать во всех конструкциях,допус-
кающих использование типов int.

enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
enum days payday;
typedef enum days DAYS;
DAYS *daysptr;
int i = tues;
anyday = mon; // так можно
*daysptr = anyday; // так можно
mon = tues; // неверно: mon — это константа

Теги перечислимых типов разделяют пространство имен с
тегами структур и объединений. Нумераторы разделяют прост-
ранство имен с обычными идентификаторами переменных:

int mon = 11;
(*
enum days (* sun, mon, tues, wed, thur, fri, sat *) anyday;
/* нумератор mon скрывает внешнее объявление int mon */
struct days (* int i, j;); // неверно: дублируется тег days
double sat; // неверно: переопределение sat
*)
mon = 12; // снова в контексте int mon

C++ В С++ нумераторы, объявленные в пределах клас-
са,имеют контекст этого класса.

Выражения

В таблице 1.19 показано, каким образом комбинируются
идентификаторы и операции для составления грамматически вер-
ных «фраз».

— 71 —
Выражением называется последовательность операций, опе-
рандов и пунктуаторов, задающих определенное вычисление.
Формальный синтаксис, показанный в таблице 1.19, обозначает,
что выражения определяются рекурсивно: под-выражения могут
быть вложены без формальных ограничений. (Однако, если ком-
пилятор не сможет обработать какое-либо слишком сложное вы-
ражение, то будет выдано сообщение об ошибке).

Выражения Turbo C++ Таблица 1.19
————————————————————
первичное-выражение:
литерал
псевдо-переменная
(выражение)
this (только С++)
:: идентификатор (только С++)
:: имя-функции-операции (только С++)
имя

литерал:
целочисленная-константа
символьная-константа
константа-с-плавающей-точкой
строка

имя:
идентификатор:
имя-функции-операции (только С++)
имя-функции-преобразования (только С++)
квалифицированное-имя (только С++)

квалифицированное-имя: (только С++)
имя-класса :: идентификатор
имя-класса :: имя-функции-операции
имя-класса :: имя-функции-преобразования
имя-класса :: имя-класса
имя-класса :: — имя-класса

постфиксное-выражение:
первичное-выражение
постфиксное-выражение[выражение]
постфиксное-выражение ()
постфиксное-выражение () (только С++)
постфиксное-выражение . имя постфиксное-выражение -> имя
постфиксное-выражение ++ постфиксное-выражение —

список-выражений:
выражение-присваивания
список-выражений , выражение-присваивания

унарное-выражение:
постфиксное-выражение
++ унарное-выражение
— унарное-выражение
унарная-операция выражение-приведения
sizeof унарное-выражение
sizeof (имя-типа)
выражение-распределения (только С++)
выражение-отмены-распределения (только С++)

унарная-операция: одно из
& * + — тильда !

выражение-распределения: (только С++)
new имя-ограниченного-типа

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

ве функции. «Параметр» обозначает переменную, определяемую в
заголовке функции, которая будет содержать в себе передавае-
мое значение.
Грамматические правила структуры фраз и лексики языка

Грамматические правила лексикиязыка Turbo C++ описаны
на стр. 5 — 58 оригинала; грамматические правила структуры
фраз Turbo C++ описаны на стр. 58 — 98 оригинала.

Грамматические правила лексики языка рассматриваются с
точки зрения существованияразличных категорий слово-ориенти-
рованных языковых единиц,называемых лексемами, распознавае-
мых компилятором. Грамматические правила структуры фраз под-
робно определяют допустимые способы группирования этих
лексем в выражения, операторы и прочие смысловые единицы
языка.

Лексемы Turbo C++ образуются из последовательности опе-
раций, выполняемых с вашейпрограммой компилятором и препро-
цессором языка.

Программа на Turbo C++ начинает свое существованиекак
последовательность ACSII-символов,представляющих собой ее
исходный код, создаваемый нажатиями клавиш при работе в под-
ходящем текстовом редакторе (например, в собственном редак-
торе Turbo C++). Базовая программная единица в Turbo C++
представляет собой файл. Обычно такойфайл соответствует фай-
лу DOS, находящемуся в оперативной памяти или на диске и
имеющему созданное по правилам DOS имя и расширение .C или .
CPP.

Сначала выполняется просмотр текста программы препро-
цессором, который ищет в нем специальные директивы препро-
цессора (см. стр. 133 оригинала). Например, директива
#include добавляет (или включает) впрог-
рамму перед фазой компиляции содержимое файла . Препроцессор также выполняет расширение любых
встреченных в программах или файлах включения макросов.

Пробельные символы

На фазе компиляции, отвечающей за распознавание лексем,
файл исходного кода программы подвергается лексическому ана-
лизу (т.е. разбиению налексемы и пробелы). Пробельными будут
обобщенно именоваться собственно символы пробелов, горизон-
тальные и вертикальныесимволы табуляции, символы новой стро-
ки и комментарии. Пробельные символы служат для обозначения
мест начала и конца лексем, и сверх этой функции, для исклю-
чения из компиляции всех избыточных символов, не входящих в
состав лексем. Например, следующие две последовательности,

int i; float f;

и

— 9 —
int i ;
float f;

лексически идентичны, а их лексический анализ в обоих
случаях дает шесть лексем:

int i ; float f ;

ASCII-символы, обычно рассматриваемые как пробельные,
могут входить в строки литералов, и в данном случаебудут за-
щищены от нормального процессаразбиения на лексемыи пробелы;
другими словами, они станут представлять собой часть строки:

char name[] = «Borland International»;

разбивается на семь лексем, включая и лексему строки
литералов «Borland International».

«Склеивание» строк символом \

Имеется специальный случай, когда передпоследним симво-
лом новойстрокинаходится символ наклонной черты влево (\). В
таком случае символы наклонной черты влево и символ новой
строки отбрасываются, что позволяет рассматривать две физи-
ческие строки текста как единое целое.

«Borland \
International»

будет рассматриваться как «Borland International» (до-
полнительную информацию см. на стр. 17 оригинала, «Строковые
литералы»

Комментарии

Комментарии представляют собой текстовые части, пред-
назначенные для аннотирования программы.Комментарии исполь-
зуются исключительно самим программистом; передлексическим
анализом они исключаются из исходного текста программы.

Существует два способа указания на комментарии: тради-
ционный метод C и метод C++. Они оба поддерживаются Turbo C+
+, и кроме того, имеется дополнительное, опциональное расши-
рение, позволяющее организовывать вложенные комментарии.
Разрешается смешанное и комбинированное использование ком-
ментариев любого типа в программах C и C++.
Комментарии C

Традиционный комментарий C представляет собой любую
последовательность символов, помещаемую послепары симво-
лов/*. Признаком конца комментарияслужитперваяпара символов*
/, встретившаяся после исходной пары /*. После выполнения
макрорасширения вся эта последовательность целиком, включая
четыре разделительных символа комментария,заменяется на один
пробел. Отметим, чтонекоторые реализации C удаляют коммента-
рии, не заменяя их на пробелы.

Turbo C++ не поддерживает не-мобильной стратегии встав-
ки лексем с помощью /**/. Вставка лексем в Turbo C++ выпол-
няетсяпри помощи заданной ANSI пары символов ##, следующим
образом:

#define VAR(i,j) (i/**/j) /* не будет работать */
#define VAR(i,j) (i##j) /* в Turbo C++ будет работать */
#define VAR(i,j) (i ## j) /* также будет работать */

В Turbo C++

— 10 —

int /* объявление */ i /* как счетчика */;

после лексического анализа даст

int i ;

то есть три лексемы: Int I ;

Вложенные комментарии

ANSI C не разрешаетвложенность комментариев. Попытка
комментировать приведенную выше строку в виде

/*int /* объявление */ i /как счетчика */; */

окончится неудачей, поскольку область действия первой
пары /* будет ограничена первой парой */. Это даст в резуль-
тате лексического анализа

i ; */

что приведет к генерированию состояния синтаксической
ошибки.

По умолчанию Turbo C++ не позволяет вложенность коммен-
тариев, однако это умолчание может быть переопределено опци-
ей компилятора. Разрешить вложенность комментариев можно ли-
бо при помощи опции -C (компилятора командной строки), либо
через меню интегрированной среды программирования
O\!C\!Source Options.

Комментарии C++

Для создания вкоде C комментариеввы можете также ис-
пользовать символы //. Это средство специфично для Turbo
C++.

C++ позволяетсоздание размещаемого в одной строке ком-
ментария при помощи двух подряд следующихсимволов наклонной
черты(//). Такой комментарий может начинаться в любой пози-
ции строки, и включает в себя все, что расположено до симво-
ла новой строки:

class X (* // это комментарий
… *);

Разделители комментариев и пробелы

В редких случаях пробелы перед /* и // или после */,
хотя и не являются синтаксически обязательными, нопозволяют
избежать проблем, связанных с мобильностью. Например, код C++

int i = j//* деление на k*/k;
+m;

при лексическом анализе дастint i = j +m; а не

int i = j/k;
+m;

как это можно было бы ожидать по традиционным соглаше-
ниям C. Более удобочитаемая форма

int i = j/ /* деление на k*/ k;
+m;

— 11 —
позволяет избежать этой проблемы.

Лексемы

Turbo C++ распознает лексемы шести классов: ключевые

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

Объявление типов Таблица 1.13
————————————————————
type t; Объект типа type

type array[10]; Десять типов: array[0]-array[9]

type *ptr; ptr это указатель типа

type &ref=t; ref = ссылка на тип (C++)

type func(void); func возвращает значение типа type

void func1(type t); func1 принимает параметр типа type

struct st (type t1; type t2); структура st содержит два типа
————————————————————

Ниже показано, как производные типы могут быть объявле-
ны в пределах класса:

class cl (* // класс cl содержит указатель ptr на тип, плюс
// функцию, принимающую параметр type (C++)
type *ptr;
public:
void func(type*);

Тип void

Void это специальный спецификатор типа, указывающий на
отсутствие каких-либо значений. Он задается в следующих си-
туациях:

— Пустой список параметров в объявлении функции:

int func(void); // функция не принимает аргументов

С++ обрабатывает 0 специальным образом. См. раздел
«Объявления и прототипы» на стр.60 и примеры кода на стр.61
оригинала.

— Когда объявленная функция не возвращает значений:

void func(int n); // возвращаемое значение отсутствует

— В качестве родового указателя. Указатель на void яв-
ляется родовым указателем на все что угодно:

void *ptr; // далее ptr может быть установлен на любой
// объект

— Выражения с проверкой типа:

extern int errfunc(); // возвращает код ошибки

(void) errfunc(); // значение возврата теряется
Фундаментальные типы

signed и unsigned — это модификаторы, применяемые к ин-
тегральным типам.

Фундаментальные спецификаторы типа создаются из следую-

— 41 —
щих ключевых слов:

char int signed
double long unsigned
float short

На базе этих ключевых слов вы можете построить
интегральные типы и типы с плавающей точкой, которые в сово-
купности называются арифметическими типами. Включаемый
файлlimits.h содержит определения диапазонов значений для
всех фундаментальных типов.

Интегральные типы

Типы char, short, int и long, а также их варианты
unsigned называются интегральными типами. Ниже приводятся
спецификаторы интегральных типов с помещенными в той же
строке синонимами.

Интегральные типы Таблица 1.14
————————————————————
char,signed char Если по умолчанию char установлен как
signed, то это синонимы
unsigned char
char,unsigned char Если по умолчанию char установлен как
unsigned, то это синонимы
signed char
int,signed int
unsigned,unsigned int
short,short int,signed short int
unsigned short,unsigned short int
long,long int,signed long int

unsigned long,unsigned long int
————————————————————

С типами char,short, int или long можно использовать
либо signed, либо unsigned. Если же использовать только сами
ключевые слова signed или unsigned, то они означают signed
int или unsigned int, соответственно.

В отсутствие слова unsigned обычно принимается тип
signed. Исключение возникаетв случае char. Turbo C++ позво-
ляет устанавливатьдля char умолчание signed или unsigned.
(Если вы не устанавливали это умолчание сами, то это умолча-
ние будет равно signed). Если умолчание установлено в значе-
ние unsigned, то объявление char ch объявит ch как unsigned.
Для переопределение этогоумолчания нужно задать signed char
ch. Аналогичным образом, если для char установлено умолчание
signed, то для объявления ch как unsigned char следует явно
указать unsigned char ch.

С int можно использовать либо long, либо short. Если
ключевые словаlong или short использованы сами по себе, то
они означают long int или short int, соответственно.

ANSI C не устанавливаетразмеры внутреннего представле-
ния этих типов, за исключением того, что размеры данных
short, int и long образуют неубывающую последователь-
ность»short

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

циализатор
new имя-типа

— 72 —

местоположение: (только С++)
(список-выражений)

имя-ограниченного-типа: (только С++)
спецификатор-типа

декларатор-ограничения: (только С++)
операция-указателя
декларатор-ограничения []

выражение-отмены-распределения: (только С++)
delete выражение-приведения
delete [выражение] выражение-приведения

выражение-приведения:
унарное-выражение
(имя-типа) выражение-приведения

выражение-типа-ссылки:
выражение-приведения
выражение-типа-ссылки .* выражение-приведения (только С
++) выражение-типа-ссылки -> выражение-приведения (только С+
+)

выражение-типа-умножения:
выражение-типа-ссылки
выражение-типа-умножения * выражение-типа-ссылки
выражение-типа-умножения / выражение-типа-ссылки
выражение-типа-умножения % выражение-типа-ссылки

выражение-типа-сложения:
выражение-типа-умножения
выражение-типа-сложения + выражение-типа-умножения
выражение-типа-сложения — выражение-типа-умножения

выражение-типа-сдвига:
выражение-типа-сложения
выражение-типа-сдвига > выражение-типа-сложения

выражение-отношения:
выражение-типа-сдвига
выражение-отношения < выражение-типа-сдвига выражение-отношения > выражение-типа-сдвига
выражение-отношения = выражение-типа-сдвига

выражение-типа-равенства:
выражение-отношения
выражение-типа-равенства = выражение-отношения
выражение-типа-равенства != выражение-отношения

выражение-И:
выражение-типа-равенства
выражение-И & выражение-типа-равенства

выражение-исключающее-ИЛИ:
выражение-И
выражение-исключающее-ИЛИ выражение-логическое-И

выражение-включающее-ИЛИ:
выражение-исключающее-ИЛИ
выражение-включающее-ИЛИ \! выражение-исключающее-ИЛИ

выражение-логическое-И:
выражение-включающее-ИЛИ

— 73 —
выражение-логическое-И && выражение-включающее-ИЛИ

выражение-логическое-ИЛИ:
выражение-логическое-И
выражение-логическое-ИЛИ !! выражение-логическое-И

условное-выражение:
выражение-логическое-ИЛИ
выражение-логическое-ИЛИ ? выражение : условное-выражение

выражение-присвоения:
условное-выражение
унарное-выражение операция-присвоения выражение-присвоения

операция-присвоения: одно из
= *= /=%= += -=

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Turbo C++ Version 1.0 Programmer’s Guide

КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

слова, идентификаторы, константы, строковые литералы, опера-
ции и знаки пунктуации (также называемые разделителями).
Формальное описание лексемы имеет следующий вид:

лексема:
ключевое слово
идентификатор
константа
строковый литерал
операция
знак пунктуации

Во время лексического анализа исходного кода лексемы
выделяются методом, при котором из строки символов обяза-
тельно выбирается лексема максимальной длины. Например, сло-
во external будетрассматриваться как отдельный идентифика-
тор, а некак ключевое слово extern, за которым следует
идентификатор al.

Ключевые слова

Ключевыми словами называются слова, зарезервированныед-
ля специальных целей, которые не должны использоваться в ка-
честве обычных имен идентификаторов. В следующих двух табли-
цах приводятся ключевые слова Turbo C++. Вы можете
использовать опции компилятора командной строки (или опции в
IDE), чтобы выбрать только ключевые словаANSI, ключевые сло-
ва UNIX и т.д. Информацию об этих опциях см. в главах 1,
«Справочник IDE», и 4, «Компилятор командной строки» в Руко-
водстве пользователя.

Все ключевые слова Turbo C++ Таблица 1.1
————————————————————
asm _ds interrupt short
auto else _loadds signed
break enum long sizeof
case _es near _ss
catch _export new static
cdecl extern operator struct
char far pascal switch
class float private template
const for protected this
continue friend public typedef
_cs goto register union
default huge _regparam unsigned
delete if return virtual
do inline _saverages void
double int _seg volatile
while
————————————————————

Расширения Turbo C++ относительно ANSI C Таблица 1.2
————————————————————
cdecl _export _loadds _saveregs
_cs far near _seg
_ds huge pascal _ss
_es interrupt _regparam
————————————————————

— 12 —

Ключевые слова, специфичные для C++ Таблица 1.3
————————————————————
catch friend operator public
class inline private template
delete new protected this
virtual
————————————————————

Регистровые псевдопеременные Turbo C++ Таблица 1.4
————————————————————
_AH _BL _CL _DL
_AL _BP _CX _DX
_AX _BX _DH _FLAGS
_BH _CH _DI _SI
_SP
————————————————————
Идентификаторы

Формальное определение идентификатора имеет следующий вид:

идентификатор:
не-цифра
идентификатор не-цифра
идентификатор цифра

не-цифра: одно из
a b c d e f g h i j k l m n o p q r s t u v w x y z _
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

цифра: одно из
0 1 2 3 4 5 6 7 8 9

Ограничения состава и длины идентификаторов

Идентификаторы представляют собой произвольные имена
любой длины, присваиваемыеклассам, объектам, функциям,пере-
менным, определяемым пользователем типам данных ит.д. Иден-
тификаторы могут содержать буквы от A до Z и от a до z, сим-
вол подчеркивания (_) и цифры от 0 до 9. Существует только
два ограничения:

1. Первый символ должен являться буквой или символом
подчеркивания.

Отметим, что идентификаторы в Turbo C++ значимы до лю-
бой длины.

2. По умолчанию Turbo C++ распознает только первые 32
символа в качестве значимых. Число значимых символов может
быть уменьшено при помощи меню или опций командной строки,
но не может быть увеличено. Используйте опцию -In TCC, либо
опцию меню O\!C\!S\!Identifier Length, где 1

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30