.: [предыдущая | оглавление | следующая] :.

2.5. Синтаксические структуры С


2.5.1. Объявления

       В этом разделе рассматриваются вопросы, связанные с объявлениями. К ним относятся следующие понятия: объект, тип, класс памяти, время действия, видимость, время существования, связывание. Рассмотрим каждое из этих понятий.

2.5.2. Объект

       Под объектом будем понимать поименованный блок оперативной памяти, в котором может содержаться некоторое фиксированное или переменное число значений (или множеств значений). С каждым значением связывается имя и тип (тип данных). Имя используется для доступа к объекту. Это имя может быть простым идентификатором, или может быть сложным выражением, которое указывает на конкретный объект. Тип объекта используется для следующих целей:
           1. для определения размера памяти, необходимой для объекта;
           2. для определения составляющих объекта, для сложного объекта;
           3. для выполнения операций проверки и преобразования типа.
       В С имеется множество стандартных и определенных пользователем типов данных. Это знаковые и без знаковые целые числа различных размеров, числа с плавающей запятой с различными точностями представления, структуры, объединения, массивы и классы.
       Объявления в С необходимы для организации объекта и связывания объекта с некоторым именем. Каждое объявление ассоциируется с идентификатором и типом данных. Большинство объявлений являются определяющими объявлениями, которые обеспечивают автоматическое создание объекта и его инициализацию. Другие объявления являются ссылочными и предназначены для указания того, что такой объект уже существует, и необходимо указать его имя и тип. Пример такого объявления может быть в случае, когда программа собирается из отдельных модулей (файлов) и некоторые объекты объявлены в одном файле, а используются в другом. Ссылочных объявлений может быть несколько, определяющее объявление должно быть одно.
       В С все идентификаторы могут использоваться только после объявления. Однако в некоторых случаях (особенно при описании) необходимо использовать имя до явного объявления. Для этих целей используется опережающая ссылка, когда имя метки, функции, структуры, объединения или класса записывается до его объявления.

2.5.3. Левое значение (Lvalue)

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

2.5.4. Правое значение (Rvalue)

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

2.5.5. Тип и класс памяти

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

2.5.6. Область действия

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

2.5.7. Блочная область действия

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

2.5.8. Область действия - вся функция

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

2.5.9. Область действия прототипа функции

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

2.5.10. Область действия – файл

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

2.5.11. Пространство имен

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

2.5.12. Видимость

       Видимость идентификатора - это свойство, определяющее возможность доступа к объекту в исходном тексте программы. Видимость обычно совпадает с областью действия, однако имеются случаи, когда объект временно становится невидимым из-за появления дублирующего идентификатора. В этом случае объект еще существует, но его идентификатор не может быть использован, пока не завершится область действия дублирующего идентификатора. Например:
...
{
      int i; char ch; //локальные идентификаторы
     
i=3; //i и ch видимы
      ...
      {
            double i;
            i=3.0e3; //double i
видим
            //int i=3 скрыт
            ch=’A’; //char ch видим
      }
     
//для double i область действия
      //завершилась
     
i++; //int i видим и i=4
      ... // char ch видим
}
... //области действия для char ch и int i завершены.

2.5.13. Время существования

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

2.5.14. Статические объекты

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

2.5.15. Локальные объекты

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

2.5.16. Динамические объекты

       Динамические объекты создаются и удаляются в любом месте программы на этапе выполнения программы с помощью вызова специальных функций. Все динамические объекты размещаются в куче (см. описание классов памяти), либо с помощью библиотечных функций типа malloc, либо с помощью оператора C++ new. Память, выделенная для динамического объекта, освобождается с помощью вызова библиотечной функции типа free или с помощью оператора delete.

.: [предыдущая | оглавление | следующая] :.