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

    Turbo C++ Version 1.0 Programmer’s Guide

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

    i = 3.0e3; // double i в контексте и видима
    // int i в контексте, но скрыта
    ch = ‘A’; // char ch в контексте и видима
    *)
    // double i вне контекста
    i += 1; // int i видима и равна 4
    … // char ch все еще в контексте и видима
    // и равна ‘A’
    *)
    … // int i и char ch вне контекста

    И снова, специальные правила действуют в отношение
    скрытых имен классов и имен компонентов классов: специальные
    операции С++ позволяют доступ к скрытымидентификаторам при
    определенных условиях (см. стр.103 оригинала).

    Продолжительность

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

    Статическая продолжительность (static)

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

    — 32 —

    При отсутствии явного инициализатора, либо вС++ конс-
    труктора, объекты со статической продолжительностью инициа-
    лизируются в ноль (или пустое значение).

    Статическую продолжительность не следует путать с фай-
    ловым или глобальным контекстом. Объектможетиметьстатическую
    продолжительность и при этом локальный контекст.

    Локальная продолжительность (local)

    Объект с локальной продолжительностью всегда имеет ло-
    кальный контекст, поскольку он не существует вне своего объ-
    емлющего блока. Обратное неверно: объект слокальным контекс-
    том может иметь статическую продолжительность.

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

    При объявлении переменных (например, int, char, float)
    спецификатор класса памяти register такжеподразумевает auto,
    однако компилятору при этом передается запрос (или рекомен-
    дация) о том, что при возможности данный объект желательно
    разместить в регистре. Turbo C++можно установить таким обра-
    зом, чтобы он распределял регистрлокальной интегральной пе-
    ременнойили переменной типа указатель, если какой-либо ре-
    гистр свободен. Если свободных регистров нет, то переменная
    распределяется как auto, или динамический локальный объект,
    без выдачи предупреждения или генерации ошибки.

    Динамическая продолжительность (dynamic)

    Объекты с динамической продолжительностью жизни созда-
    ются и разрушаются конкретными вызовами функций при выполне-
    нии программы. Им распределяется памятьиз специального ре-
    зерва памяти, называемого кучей, при помощи либо стандартных
    библиотечных функций, какнапример malloc, либо при помощи
    операции С++ new. Соответствующая отмена распределения вы-
    полняется при помощи free или delete.

    Единицы трансляции

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

    единица-трансляции:
    внешнее-объявление
    единица-трансляции внешнее-объявление

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

    — 33 —
    Слово external имеет в С несколько значений; в данном
    случае оно относится к объявлениям, находящимся вне ка-
    ких-либо функций, и которые, следовательно, имеют контекст
    файла. (Отдельным свойством является внешний тип компоновки;
    см.следующий раздел, «Компоновка».) Любое объявление, также
    резервирующее память для объекта или функции, называется оп-
    ределением (или объявлением определения). Более подробную
    информацию см. в разделе «Внешние объявления и определения»
    на стр.36 оригинала.

    Компоновка

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

    Каждое вхождение конкретного идентификатора с типом
    компоновки external представляет тот же самый объект или
    функцию во всем множестве файлов и библиотек, составляющих
    программу. Каждое вхождение конкретного идентификатора с ти-
    пом компоновки internal представляет тот же самый объект или
    функцию только в пределах одного файла. Идентификаторы с ти-
    пом компоновки no (отсутствие) представляет уникальные эле-
    менты программы.

    Ниже приводятсяправила внешней (external) и внутренней
    (internal) компоновки:

    1. Любой идентификатор объекта или файла, имеющий фай-
    ловый контекст, будет иметь внутренний тип компоновки, если
    его объявление содержит спецификатор класса памяти static.

    Для С, если один и тот же идентификатор в пределах од-
    ного файла появляется и с внутренним, и с внешним типом ком-
    поновки, то идентификатор будет иметь внутренний тип компо-
    новки.

    2. Если объявление идентификатора объекта или функции
    содержит спецификатор класса памяти extern, то идентификатор
    имеет тот же тип компоновки, что и видимое объявление иден-
    тификатора с файловым контекстом. Если такого видимого объ-
    явления не имеется, то идентификатор будет иметь внешний тип
    компоновки.

    3. Если функция объявлена без спецификатора класса па-
    мяти, то ее тип компоновки определяется, как если бы был ис-
    пользован спецификатор класса памяти extern.

    4. Если идентификатор объекта с файловым контекстом
    объявлен без спецификатора класса памяти, то идентификатор
    имеет внешний тип компоновки.

    Следующие идентификаторы не имеют атрибута типа компо-
    новки:

    1. Любой идентификатор, объявленный иначе, чем объект

    — 34 —
    или функция (например, идентификатор typedef).

    2. Параметры функции.

    3. Идентификаторы с контекстом блока в случае объектов,
    объявленных без спецификатора класса памяти extern.

    Синтаксис объявления

    Все шесть взаимосвязанных атрибута (класс памяти, тип,
    контекст, видимость,продолжительность и тип компоновки) мо-
    гут быть разными способами определены при помощи объявлений.

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

    Страницы: 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++, а также ваши собс-
    твенные программы и файлы заголовковобеспечиваютоднозначные
    идентификаторы (или выводимые из них выражения) и типы, та-
    ким образом, что Turbo C++ можетнепротиворечиво выполнять
    доступ, интерпретировать и (возможно) изменять битовые коды
    в памяти, соответствующей каждому активному объекту вашей
    программы.

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

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

    — 29 —
    Именующие выражения (Lvalues)

    Именующее выражение представляет собой локатор объекта,
    выражение, которое обозначает объект. Примером именующего
    выражения может служить *P, где P это выражение, дающее не-
    пустой указатель. Модифицируемое именующее выражение -это
    идентифицирующее выражение, относящееся к объекту, к которо-
    му возможен доступ и допустимо его изменение в памяти. Ука-
    затель константы const, например, не является модифицируемым
    именующим выражением. Указатель на константуможетбыть изме-
    нен (а подлежащее обращению по этому указателю значение — не
    может).

    Исторически в слове Lvalues буква L означает «левый»;
    это означает, что Lvalue допускается в левой части (априни-
    мающей части) оператора присваивания. Здесь в левой части
    оператора присваивания допустимы только модифицируемые име-
    нующие выражения. Например, если a и b — это не являющиеся
    константами целочисленные идентификаторы с правильно распре-
    деленнымидля них областями памяти, тооба они являются моди-
    фицируемыми именующими выражениями, и присваиваниятипа a =
    1;и b = a + b; вполне допустимы.

    Значения переменной (Rvalues)

    Выражение a + b не можетявляться именующим выражением,
    и выражение типа a + b = a недопустимо, поскольку выражение
    в левой части не относится кобъекту. Такие выражения часто
    называют значением переменной (значение правой части выраже-
    ния).

    Типы и классы памяти

    Для связи идентификаторов с объектами требуется, чтобы
    каждый идентификаторимел как минимум два атрибута: класс па-
    мяти и тип (иногда его называют типомданных). Компиля-
    торTurboC++ определяет эти атрибуты появным или неявным объ-
    явлениям в исходном коде программы.

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

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

    Контекст

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

    — 30 —
    Контекст блока

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

    Контекст функции

    Единственными идентификаторами, имеющими контекст типа
    функции, являются метки операторов. Именаметок могут быть
    использованыв операторах goto влюбой точке функции,где объ-
    явлена данная метка. Метки объявляютсянеявно; для этого за-
    писывается имя_метки: и за ним оператор. Имена меток в пре-
    делах функции должны быть уникальными.

    Контекст прототипа функции

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

    Контекст файла

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

    Контекст класса (С++)

    Классом можно считать именованный набор компонентов,
    включая сюда структуры данных и действующие с ними функции.
    Контекст класса относится, за некоторыми исключениями, к
    именам компонентов конкретного класса. Классы и ихобъекты
    имеют множество специальных правил доступа и определения
    контекста; см. стр. 102 — 113 оригинала.

    Контекст и пространства имен

    Пространство имен — это контекст, в пределах которого
    идентификатордолженбыть уникальным. В С существует четыре
    раздельных класса идентификаторов:

    1. Имена меток операторов goto. Эти имена должны быть
    уникальными в пределах функции, в которой они объявлены.

    2. Теги структур, объединений и перечислимых данных.
    Они должны быть уникальными в пределах блока, в котором они
    определены. Теги, объявленные вне какой-либо функции, должны
    быть уникальными относительно всех тегов, определенных вов-
    не.

    В С++ структуры, классы и перечислимые данные относятся
    к одному и тому же пространству имен.

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

    4. Переменные, определения типа и компоненты перечисли-
    мых данных. Они должны бытьуникальными вконтексте, где они
    определены. Идентификаторы, объявленные внешними, должны
    быть уникальными среди переменных, объявленных вовне.

    — 31 —

    Видимость

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

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

    Видимость не может выходить за пределы контекста; но
    контекст может превышать видимость.


    (*
    int i; char ch; // автоматическое распределение по
    умолчанию
    i = 3; // int i и char ch в контексте и видимы

    (*
    double i;

    Страницы: 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

    Фигурные скобки

    (**) (Открывающие и закрывающие фигурныескобки) обозна-
    чают начало и конец составного оператора:

    if (d == z)
    (*
    ++x
    func();
    *)

    Закрывающая фигурная скобка служит терминатором состав-
    ного оператора, поэтому (;) (точка с запятой) после *) не
    требуется, за исключением структур или объявлений классов.
    Часто точка с запятой недопустима, как например в случае

    if (оператор)
    (**); /* недопустимое использование точки с запятой */
    else

    Запятая

    Запятая (,) отделяет элементы списка аргументов функции:

    void func(int n, float f, char ch);

    Запятая часто используется как операция в «операции с

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

    func(i, j); /* вызов функции с двумя аргументами */
    func((exp1, exp2), (exp3, exp4, exp5)); /* также вызов
    функции с двумя аргументами */

    Точка с запятой

    Точка с запятой (;) служит терминатором оператора. Лю-
    бое допустимое выражениеС (включая и пустое выражение), за
    которым следует (;), интерпретируется как оператор, называе-
    мый оператором выражения. Выражениевычисляется, а его значе-
    ние отбрасывается. Если такое выражение не имеетпобочных эф-
    фектов, то TurboC++ может его проигнорировать.

    a + b; /* a + b вычисляется, но полученное значение
    теряется */
    ++a; /* имеется побочный эффект для a, но результат ++a
    */
    /* теряется */
    ; /* пустое выражение = нулевой оператор */

    Точки сзапятой частоиспользуются для создания пустых
    операторов:

    for (i = 0; i < t; i++) (* ; *) Двоеточие Двоеточие (:) служит для обозначения оператора с меткой: stsrt: x=0; ... goto stsrt; ... switch (a)(* case 1: puts("Первый"); break; case 2: puts("Второй"); break; ... default: puts("Ни тот, ни другой!"); break; *) Метки рассматриваются на стр.92 оригинала. Многоточие Многоточие (...) представляет собой три последовательно расположенные точки без пробелов между ними. Многоточия ис- пользуются в списках формальных аргументовпрототипов функций для обозначения переменногочисла аргументов, либо аргументов с изменяющимся типом: void func(int n, char ch,...); Данное объявление указывает, что func будет определена таким образом, что вызовы ее должны содержать как минимум два аргумента, int и char,но также могут иметь и любое число дополнительных аргументов. В С++ запятую, предшествующую многоточию, можно опустить. - 27 - Звездочка (объявление указателя) Звездочка (*) в объявлении переменной обозначает созда- ние указателя на тип: char *char_ptr; /* объявление указателя на тип char */ Можно объявить указатели с несколькими уровнями косвен- ности, что обозначается соответствующим количеством звездо- чек: int **int_ptr; /* указатель на указатель на int */ double ***double_ptr /* указатель на указатель на указатель на тип double */ Звездочка также используется в качестве операции обра- щения через указатель, либо операции умножения: i = *int_ptr; a = b * 3.14; Знак равенства (инициализатор) Знак равенства (=) разделяет объявления переменных от списков инициализации: char array[5] = (* 1, 2, 3, 4, 5 *); int x = 5; В функциях С никакой код не может предшествовать ника- ким объявлениям переменных. В С++ объявления любого типа мо- гут находиться (с некоторыми ограничениями) в любой точке внутри кода. В списке аргументов функции С++ знак равенства указыва- ет на значение параметра по умолчанию: int f(int i = 0) (* ... *) /* параметр i имеет значение по умолчанию ноль */ Знак равенства используется также как операция присвое- ния в выражениях: a = b + c; ptr = farmalloc(sizeof(float)*100); Знак фунта (директива препроцессора) Знак фунта (#) означает директиву препроцессора, если она является первым не-пробельным символом встроке. Он зада- ет действие компилятора, не обязательно связанное с генера- цией кода. Более подробно директивы препроцессора описаны на стр.133 оригинала. # и ## (двойной знак фунта) также используются как опе- рации замены и слияния лексем на фазе сканирования кода препроцессором. Объявления В данном разделе кратко рассматриваются концепции, свя- занные с объявлениями: объектов, типов, классов памяти, кон- текста, видимости, продолжительности и типом компонов- ки.Преждечем перейти к рассмотрению полного синтаксиса объявления, важно иметь общее представление об этих поняти- ях. - 28 - Контекст, видимость, продолжительность и тип компоновки определяют части программы,из которых могут быть сделаны до- пустимые ссылки на идентификатор сцельюдоступа к соответс- твующему объекту. Контекст обсуждаетсяна стр.29 оригинала, видимость - на стр.30; продолжительность рассматривается, начиная со стр. 31, а тип компоновки - на стр.32. Объекты Объектом называется идентифицируемая область памяти, которая может содержать фиксированное значение переменной (или набор таких значений). (Используемое в данном случае слово "объект" не следует путать с более общим термином, ис- пользуемым в объектно-ориентированных языках - см. главу 5, "Введение в С++" в документе "Начало работы".) Каждая вели- чина имеет связанное с ней имя и тип (который также называют типом данных). Имя используется для доступа к объекту. Имя может являться простым идентификатором, либо сложнымвыраже- нием, уникальным образом "указывающим" на данный объект. Тип используется для - для определения требуемого количества памяти при ее исходном распределении, - для интерпретации битовых коды, находимых в объектах при последующих к ним обращениях, - а также в многочисленных ситуациях контроля типа, требуемого для обнаружения возможных случаев недопустимого присваивания. 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

    условное-выражение

    Выражения с константами не могут содержать приводимых
    ниже операций, если эти операции не содержатся в операнде
    операции sizeof:

    — присваивание
    — декремент
    — вызов функции
    — запятая
    Описание операций

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

    Расширения C++ предлагают дополнительные операции для

    — 23 —
    доступа к компонентам класса и их объектам, атакже механизм
    перегрузки операций. Перегрузка позволяет переопределять
    действие любых стандартных операций применительно к объектам
    заданного класса. В данном разделе мы ограничимся рассмотре-
    нием стандартных операций TurboC++. Перегрузка рассматрива-
    ется, начиная со стр.124 оригинала.

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

    Операции в Turbo C++ определяются следующим образом:

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

    [] () . -> ++ —
    & * + — тильда !
    sizeof / % > < > = == != ^
    \! && \!\! ?: = *=
    /= %= += -= =
    &= ^= \!= , # ##

    Операции # и ## используются только препроцессором (см.
    стр. 133 оригинала).

    Следующие операции являются специфичными для C++:

    :: .* ->*

    За исключением операций [], () и ?:, служащих для запи-
    си выражений в скобках, многосимвольные операции рассматри-
    ваются в качестве одной лексемы. Лексема одной и той же опе-
    рации может иметьнесколько интерпретаций, в зависимости от
    контекста. Например,

    A * B Умножение
    *ptr Обращение по ссылке

    A & B Поразрядное И
    &A Операция адресации
    int & Модификатор указателя (C++)

    label: Метка оператора
    a ? x : y Условный оператор

    void func(int n); Объявление функции
    a = (b+c)*d; Выражение со скобками

    a, b, c; Выражение с запятой
    func(a, b, c); Вызов функции

    a = -b; Поразрядное вычитание (дополнение до
    единицы)
    -func() (*delete a;*) Деструктор (C++)

    Унарные операции

    & Операция адресации
    * Операция обращения по ссылке
    + Унарный плюс
    — Унарный минус
    тильда Поразрядное дополнение (дополнение до
    единицы)
    ! Логическое отрицание

    — 24 —
    ++ Префикс: пред- инкремент;
    Постфикс: пост- инкремент
    — Префикс: пред- декремент;
    Постфикс: пост- декремент
    Бинарные операции

    Операции типа сложения + Бинарный плюс (сложение)
    — Бинарный минус (вычитание)

    Операции типа умножения * Умножение
    / Деление
    % Остаток от деления

    Операции сдвига > Сдвиг вправо

    Поразрядные операции & Поразрядное И
    ^ Поразрядное исключающее ИЛИ
    \! Поразрядное включающее ИЛИ

    Логические операции && Логическое И
    \!\! Логическое ИЛИ

    Операторы присваивания = Присваивание
    *= Присвоить произведение
    /= Присвоить частное
    %= Присвоить остаток
    += Присвоить сумму
    -= Присвоить разность
    = Присвоить сдвиг вправо
    &= Присвоить поразрядное И
    ^= Присвоить поразрядное исключающее
    ИЛИ
    \!= Присвоить поразрядное ИЛИ

    Операции отношения < Меньше > Больше
    = Больше или равно

    Операции равенства == Равно
    != Не равно

    Операции выбора . Прямой селектор компонента
    компонента -> Косвенный селектор компонента

    Операции с компонентами :: Доступ/разрешение контекста
    класса .* Обращение через указатель
    к компоненту класса
    ->* Обращение через указатель
    к компоненту класса

    Условные операции a ? x : y «Если a то x иначе y»

    Операция запятой , Вычислить, например, a, b, c
    слева — направо

    Функции этих операций,также как их синтаксис, приоритет
    и свойства ассоциативности рассматриваются, начиная со стр.
    73 оригинала.

    Пунктуаторы

    В TurboC++ пунктуаторы, также называемые разделителями,
    определяются следующим образом:

    — 25 —
    пунктуатор: одно из
    [ ] ( ) (* *) , ; : … * = #

    Квадратные скобки

    [] (открывающая и закрывающая квадратные скобки) указы-
    вают на индексы одно- и многомерных массивов:

    char ch, str[] = «Stan»
    int mat[3][4]; /* матрица 3 x 4 */
    ch = str[3]; /* 4-й элемент */

    Круглые скобки

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

    d = c * (a + b); /* переопределение нормального приори-
    тета */
    /* выполнения операций */
    if (d == z) ++x; /* важно при использовании условных
    операций */
    func(); /* вызов функции без аргументов */
    int (*fptr)(); /* объявление указателя функции */
    fptr = func; /* отсутствие () означает указатель функ-
    ции */
    void func2(int n); /* объявление функции с аргументами */

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

    #define CUBE(x) ((x) * (x) * (x))

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

    Страницы: 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

    enum team (* giants, cubs=3, dodgers = giants + 1 *);

    константы установлены следующим образом:

    giants = 0, cubs = 3, dodgers = 1

    Значения констант не обязаны быть уникальными:

    enum team (* giants, cubs = 1, dodgers = cubs — 1 *);

    Допустимы также отрицательные инициализаторы.

    Строковые литералы

    — 20 —
    Строковые литералы, известные также как строковые конс-
    танты, образуют специальную категорию констант, используемых
    для работы с фиксированными последовательностями символов.
    Строковый литерал имееттип данных array ofchar и класспамя-
    тиstatic, и записываетсякак последовательность произвольного
    количества символов, заключенных в двойные кавычки:

    «Это строковый литерал!»

    Нулевая (пустая) строка записывается как «».

    Символы внутри двойных кавычек могут включатьуправляю-
    щие последовательности (см. стр. 13 оригинала). Например,
    данный код,

    «\t\t\»Имя \»\\\tАдрес\n\n»

    распечатается следующим образом:

    «Имя «\ Адрес

    Слову «Имя » будет предшествовать два символа табуля-
    ции; слову Адрес предшествуетодин символтабуляции. Строка
    заканчиваетсядвумя символами новой строки. Последователь-
    ность \» обеспечивает вывод внутренних кавычек.

    Строка литерала хранится в памяти как заданная последо-
    вательность символов,плюс конечный пустой символ (‘\0’). Ну-
    левая строка хранится в виде одного символа ‘\0’.

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

    #include

    main()
    (*
    char *p;

    p = «Это пример того, как Turbo C++»
    » автоматически\nвыполняет для вас конкатенацию»
    » очень длинных строк,\nчто позволяет получить»
    » более красивые программы.»;
    printf(*p*);
    *)

    На выходе программы будет:

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

    Для расширения строковой константы за границы строки в
    качестве символа продолжения можно использовать обратную
    наклонную черту (\):

    put(«В действительности \
    это однострочная строка символов»);
    Константы и их внутреннее представление

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

    — 21 —
    личных типов данных в целом определяется архитектурой мик-
    ропроцессоров 8088 и 80×86. В следующей таблице сведены
    размеры и соответствующие диапазоны значений для типов дан-
    ных, определяемых в Turbo C++. Дополнительную информацию об
    этих типах данных см. на стр. 39 оригинала. Внутреннее
    представление типов данных см. на рис.1.

    Типы данных, размеры и диапазоны значений Таблица 1.9
    ————————————————————
    Тип Размер Диапазон Примеры применения
    ————————————————————
    unsigned char8 0 до 255 Малые числа и полный

    набор символов PC

    char8 -128 до 127 Самые малые числа и
    ASCII-символы

    enum 16 -32,768 до 32,767 Упорядоченные наборы
    значений

    unsigned int 16 0 до 65,535 Большие числа и циклы

    short int 16 -32,768 до 32,767 Счетчики, малые числа,
    управление циклами

    int 16 -32,768 до 32,767 Счетчики, малые числа,
    управление циклами

    unsigned long 32 0 до 4,294,967,295 Астрономические
    расстояния

    long 32 -2,147,483,648 до 2,147,483,647
    Большие числа, население

    -38 38
    float 32 3.4 x 10 до 3.4 x 10
    Научные расчеты (точность
    7 разрядов)

    -308 308
    double 64 1.7 x 10 до 1.7 x 10
    Научные расчеты (точность
    15 разрядов)

    -4932 4932
    long double 80 3.4 x 10 до 1.1 x 10
    Финансовые расчеты
    (точность 19 знаков)

    near pointer 16 Не существует Манипулирование адресами
    памяти

    far pointer 32 Не существует Манипулирование адресами
    памяти вне текущего
    сегмента
    ————————————————————

    Страницы: 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

    типа данных char диапазоне (от 0 до 0xff для Turbo C++).
    Большие значения ведутк появлению ошибки компиляции «Numeric
    constant too large» («числовая константа слишком велика»).
    Например, восьмеричное число \777 больше максимально допус-
    тимого значения \377, и вызовет генерирование ошибки. Первое
    же не-восьмеричноеили не-шестнадцатиричное значение, встре-
    ченное в восьмеричнойили шестнадцатиричной управляющей пос-

    — 17 —
    ледовательности, означает конец данной последовательности.

    В исходной версии Turbo C допускалось только три цифры
    шестнадцатиричной управляющей последовательности. Новые пра-
    вила ANSI C, реализованные в Turbo C версии 2.0 и TurboC++,
    могут вызвать проблемы со старыми кодами, предполагающими
    преобразование только первых трех символов. Например, при
    использовании версии Turbo C 1.x для определения строки со
    звуковым сигналом (код ASCII 7), после которого следуют чис-
    ловые символы, программист может написать:

    printf(«\x0072.1Простая операционная система»);

    Предполагается, что эта строка будет интерпретирована
    как \x007 и «2.1Простая операционная система». Однако, Turbo
    C++ (и TurboC версии 2.0) компилируют ее как шестнадцатирич-
    ное число \x0072 и литеральную строку «.1Простая операцион-
    ная система».

    Чтобы избежать этих проблем, перепишитеваш код следую-
    щим образом:

    printf(«\x007» «2.1Простая операционная система»);

    Неоднозначность может возникнуть также и в случае,
    когда за восьмеричной управляющей последовательностью следу-
    ет невосьмеричная цифра. Например, поскольку 8 и 9не являют-
    ся допустимыми восьмеричными цифрами, константа \258 будет
    интерпретирована какдвухсимвольнаяконстанта, составленная из
    символов \25 и 8.

    В следующей таблице показаны допустимые управляющие
    последовательности.

    Управляющие последовательности Turbo C++ Таблица 1.7
    ————————————————————
    Последовательность Значение СимволыВыполняемая функция
    ————————————————————
    \a 0x07BELЗвуковой сигнал
    \b 0x08BSЗабой
    \f 0x0CFFПеревод бланка
    \n 0x0ALFНовая строка (перевод строки)
    \r 0x0DCRВозврат каретки
    \t 0x09HTТабуляция (горизонтальная)
    \v 0x0BVTВертикальная табуляция
    \\ 0x5c\Обратная наклонная черта

    Для фактического представления символа ASCII «обратная
    наклонная черта», используемого например в команде DOS PATH,
    следует записывать ее как \\.

    \’ 0x27 ‘ Одинарная кавычка (апостроф)
    \» 0x22 » Двойная кавычка
    \? 0x3F ? Вопросительный знак
    \OлюбыеO = строка до трех восьми-
    ричных цифр
    \xH любыеH = строка шестнадцатирич-
    ных цифр
    \XH любыеH = строка шестнадцатирич-
    ных цифр
    ————————————————————

    Специальные двух-символьные константы Turbo C++

    Turbo C++ поддерживает также двух-символьные константы
    (например, ‘An’, ‘\n\t’ и ‘\007\007’). Эти константы предс-

    — 18 —
    тавлены 16-битовыми значениями типаInt, где первый символ
    расположен в младшем байте, а второй символ — в старшем бай-
    те. Эти константы не могут быть перенесены на другие компи-
    ляторы C.

    Символьные константы со знаком и без знака

    В C одно-символьные константы, такие как ‘A’, ‘\t’ и ‘\
    007’, такжепредставлены 16-битовыми значениями типа Int. В
    этом случае происходит расширение младшего байта в старший
    байт по знаку; такимобразом, еслизначение превышает 127 (ос-
    нование 10), то старший байт устанавливается равным -1
    (=0xFF). Это свойство можно отменить, объявив, что по умол-
    чанию тип char является unsigned (при помощи опции -R TCC,
    либо выбором в меню Options \! Compiler \! CodeGeneration
    опцию Unsigned Characters), чтоприведет к обнулению старшего
    байта независимо от значения младшего байта.

    Широкие символьные константы (только C)

    Символьная константа, которой предшествует L, называет-
    ся широкой символьнойконстантой и имеет тип данных wchar_t
    (интегральный тип, определяемый в stdef.h). Например,

    x = L ‘AB’;

    Константы с плавающей точкой

    Константа с плавающей точкой состоит из шести частей:

    — десятичное целое
    — десятичная точка
    — десятичное дробное
    — e или E и целочисленная экспонента со знаком (опционально)
    — суффикс типа: f или F, либо l или L (опционально)

    Десятичное целое или десятичное дробное (но не то и
    другое) можно опустить. Можно опустить либо десятичную точ-
    ку, либо букву e (или E) с целочисленной экспонентой со зна-
    ком (но не то и другое). Эти правила позволяют выполнять за-
    пись чисел как в обычной, так и в научной (экспоненциальной)
    форме.

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

    Примеры:
    ————————————-
    Константа Значение
    ————————————-
    6
    23.45e6 23.45 x 10

    .0 0

    0. 0
    0
    1. 1.0 x 10 = 1.0

    -1.23 -1.23
    -5
    2e-5 2.0 x 10
    10
    3E+10 3.0 x 10

    — 19 —
    34
    .09E34 0.09 x 10
    ————————————-

    Константы с плавающей точкой — типы данных

    При отсутствии каких-либо суффиксов константы с плаваю-
    щей точкой имеют тип данных double. Однако, вы можете прис-
    воить константе с плавающей точкой тип данных float, добавив
    к ней суффикс f или F. Аналогичным образом, суффиксl илиL
    присвоит константе тип данных long double. В следующей таб-
    лице показаны диапазоны значений, которые могут принимать
    типы данных float, double и long double.

    Размеры и диапазоны
    констант с плавающей точкой Turbo C++ Таблица 1.8
    ————————————————————
    Тип Размер (в битах) Диапазон значений
    ————————————————————
    -38 38
    float 32 3.4 x 10 до 3.4 x 10
    -308 308
    double 64 1.7 x 10 до 1.7 x 10
    -4932 4932
    long double 80 3.4 x 10 до 1.1 x 10
    ————————————————————
    Перечислимые константы

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

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

    enum team (* giants, cubs, dodgers *);

    giants, cubs и dodgers это перечислимые константы типа
    team, которые могут быть назначены любым переменным типа
    team или любой другой переменной целочисленного типа. Значе-
    ния, принимаемые перечислимыми константами,

    giants = 0, cubs = 1, dodgers = 2

    при условии отсутствия явных инициализаторов. В следую-
    щем примере,

    Страницы: 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

    — 14 —
    восьмеричная-константа
    шестнадцатиричная-константа

    десятичная-константа:
    цифра-кроме-нуля
    десятичная-константа цифра

    восьмеричная-константа:
    0
    восьмеричная-константа восьмеричная-цифра

    шестнадцатиричная-константа:
    0 x шестнадцатиричная-цифра
    0 X шестнадцатиричная-цифра
    шестнадцатиричная-константа шестнадцатиричная-цифра

    цифра-кроме-нуля: одно из
    1 2 3 4 5 6 7 8 9

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

    шестнадцатиричная-цифра: одно из
    0 1 2 3 4 5 6 7 8 9
    a b c d e f
    A B C D E F

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

    суффикс-константы-без-знака: одно из
    u U

    суффикс-длинной-константы: одно из
    l L

    перечислимая-константа:
    идентификатор

    символьная-константа:
    последовательность-символов-c

    последовательность-символов-c:
    символ-c
    последовательность-символов-c символ-c

    символ-c:
    любой символ из исходного набора символов, за
    исключением символов одинарной кавычки (‘), обратной наклон-
    ной черты (\) или управляющей-последовательности символа но-
    вой строки.

    управляющая-последовательность: одно из
    \* \’ \? \\
    \a \b\f \n
    \o \oo\ooo \r
    \t \v\Xh… \xh…
    ————————————————————

    Целочисленные константы

    Целочисленные константы могут быть десятичными (основа-
    ние системы счисления 10), восьмеричными (основание 8)или
    шестнадцатиричными (основание 16). При отсутствии переопре-
    деляющих суффиксов типданныхцелочисленной константы выводит-

    — 15 —
    ся из ее значения, как показано в таблице 1.6. Отметим, что
    правила для десятичных и не-десятичных констант различны.

    Десятичные константы

    Допустимыми являются десятичные константы величиной от
    0 до 4,294,967,295. Константы, выходящие за указанные преде-
    лы, вызывают ошибку. Десятичныеконстанты не могут иметь ве-
    дущие нули. Целочисленнаяконстанта с ведущим нулем рассмат-
    риваетсякак восьмеричная. Таким образом,

    int i = 10; /* десятичное 10 */
    int i = 010; /* десятичное 8 */
    int i = 0; /* десятичное 0 = восьмеричному 0! */

    Отрицательные константы- это просто константы без
    знака, к которым применена унарная операция минус.

    Восьмеричные константы

    Все константыс ведущим нулем рассматриваются как вось-
    меричные.Если восьмеричная константа содержит недопустимые
    цифры 8 или 9, выдается сообщение об ошибке. Ошибка будет
    также выдаваться при превышении восьмеричной константой зна-
    чения 037777777777.

    Шестнадцатиричные константы

    Все константы, начинающиеся с 0x (или 0X) рассматрива-
    ются как шестнадцатиричные. Шестнадцатиричные константы,пре-
    вышающие 0xFFFFFFFF, приводят к ошибке.

    Суффиксы длинных констант и констант без знака

    Если законстантой следует суффикс L (или l), то такая
    константа будет представлена как длинная (типа long).Анало-
    гичным образом, суффикс U (или u) делает константу констан-
    той без знака (unsigned). Если численное значение константы
    превышает десятичное 65,535, независимо от используемого ос-
    нованиясистемы счисления, то такая константа будет иметь тип
    unsigned long. Суффиксы можно указывать для одной и той же
    константы в произвольном порядке и набирать в любом регист-
    ре: ul, lu, UL и т.д.

    Тип данных константы при отсутствии каких-либо суффик-
    сов вообще (U, u, L или l) берется из следующей таблицы,пер-
    выйже, который удовлетворяет требованиям величины этой
    константы:

    ————————————————————
    десятичная int, long int, unsigned long int
    восьмеричная int, unsigned int, long int, unsigned long
    int
    шестнадцатиричная int, unsigned int, long int, unsigned
    long int
    ————————————————————

    Если константа имеет суффикс U или u, то ее тип данных
    будет первым из типов unsigned int, insigned long int, кото-
    рый удовлетворит требованиям ее величины.

    Если константа имеет суффикс L или l, то ее тип данных
    будет первым из типов long int, unsigned long int, который
    удовлетворит требованиям ее величины.

    Если константа имеет оба суффикса u и l (ul, lu, Ul,
    lU,uL, Lu, LU или UL), то она будет иметь тип данных

    — 16 —
    unsigned long int.

    В таблице 1.6 сведены представления целочисленных конс-
    тант для всех трех систем счисления. Указанные типы данных
    предполагают отсутствие переопределяющих суффиксов L или U.

    Целочисленные константы Turbo C++ без L или U Таблица 1.6
    ————————————————————
    Десятичные константы

    0 до 32,767 int
    32,768 до 2,147,483,647 long
    2,147,483,648 до 4,294,967,295 unsigned long

    > 4294967295 Генерируется ошибка

    Восьмеричные константы

    00 до 077777 int
    0100000 до 0177777 unsigned int
    02000000 до 017777777777 long
    020000000000 до 037777777777 unsigned long

    > 037777777777 Генерируется ошибка

    Шестнадцатиричные константы

    0x0000 до 0x7FFF int
    0x8000 до 0xFFFF unsigned int
    0x10000 до 0x7FFFFFFF long
    0x80000000 до 0xFFFFFFFF unsigned long

    > 0xFFFFFFFF Генерируется ошибка
    ————————————————————

    Символьные константы

    Символьная константа — этоодин или более символов, зак-
    люченных в одинарные кавычки, например ‘F’, ‘=’, ‘\n’. В C
    константы изодногосимвола имеюттип Int и имеют внутреннее
    представление16 бит, в то времякак старший байт слова запол-
    няется нулем или знаком. В C++ константа из одного символа
    имеет тип char. Многосимвольные константы как в C, так и в C
    ++, имеют тип данных Int.

    Управляющие последовательности

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

    Обратнаянаклонная черта используетсяс восьмеричными или
    шестнадцатиричными числами для представления ASCII-символами
    управляющего кода, соответствующемуэтому значению; например,
    ‘\03’ вместо Ctrl-C или ‘\x3F’ вместо вопросительного знака.
    В управляющей последовательности может содержаться строка
    длиной до трех восьмеричных илилюбое число шестнадцатиричных
    цифр,при условии, чтоданноезначение лежит в допустимом для

    Страницы: 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

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

    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

    Расширенная память (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