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