Имя обозначает (идентифицирует) объект, функцию, тип, член класса/структуры. Имя вводится в программе или среде выполнения описанием. Имя можно использовать только в пределах части программы, называемой областью видимости имени. Имя имеет тип, который задает его использование.
Объект — это область памяти. Поименованный объект имеет класс памяти, который определяет его время жизни. Интерпретация значений, хранящихся в объекте, определяется типом выражения, задающего доступ к объекту.
Описания и определения
Описание делает известным в программе одно или несколько имен. Описание считается определением. Ниже приведены примеры описаний:
int a; var c=1; f(x) { return x+a; } struct S a;
Для каждого объекта или функции, использующегося в программе, должно быть только одно описание.
Область видимости
Есть три вида областей видимости: локальная, глобальная и класс.
Локальная: Имя, описанное в блоке, локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Имена формальных параметров рассматриваются, как если бы они были описаны в самом объемлющем блоке этой функции.
Глобальная: Имя, описанное вне любого блока, может использоваться в любой единице трансляции. Имя, используемое в данной единице трансляции, и не описанное в ней считается глобальным именем, описанным в другой единице трансляции.
Класс: Имя члена класса локально для его класса и может использоваться только после примененной к объекту его класса операции селектора (точка).
Имя может быть скрыто явным описанием того же имени в объемлющем блоке. Моментом описания имени считается момент завершения описателя имени, предшествующей части инициализации (если она есть). Например:
int y=12; int x=x;
Здесь x инициализируется своим собственным (неопределенным) значением.
Связывание
Программа состоит из одного или нескольких модулей, связываемых друг с другом. Модуль состоит из последовательности описаний. Всякое использование некоторого имени с глобальной областью видимости подразумевает один и тот же объект либо функцию. Такие имена называются внешними или говорят, что они имеют внешнее связывание. Для каждой функции либо объекта должно быть в точности одно описание, используемого в программе.
Классы памяти
Существует два класса памяти: автоматический и статический.
Автоматические объекты инициализируются всякий раз, когда управление переходит в блок, где они определены и уничтожаются по выходе из этого блока.
Статические объекты инициализируются всякий раз при загрузке модуля, где они определены и уничтожаются при выгрузке этого модуля.
Все глобальные объекты имеют статический класс памяти. Все локальные объекты имеют автоматический класс памяти.
Типы
Существуют два вида типов:
Основные типы
Существует несколько основных типов.
Объекты, описанные как символы (char), могут хранить любой элемент из базового набора символов (1 байт). Если символ этого набора хранится в символьной переменной, то ее значение равно целому значению кода этого символа.
С помощью описаний short, int и long можно определить целые трех различных размеров (2, 4 и 4 байта соответственно).
Для каждого из типов char, short, int и long существует соответствующий беззнаковый тип, который занимает тот же объем памяти (unsigned char, short, int и long соответственно).
Существует два типа с плавающей точкой: float и double.
Типы char, short, int и long называются целочисленными типами. Целочисленные типы вместе с типами с плавающей точкой образуют арифметические типы.
Тип string определяет строку символов.
Объект типа var способен хранить значения любого вышеописанного типа. Текущий тип значения в таком объекте определяется типом последнего значения, присвоенного ему.
Производные типы
Существует потенциально бесконечное число производных типов, которые строятся из основных типов следующими способами:
массив объектов данного типа,
классы и структуры, содержащие совокупность объектов различных типов.
Lvalue
Любой объект — это некоторая область памяти, lvalue — выражение, ссылающееся на объект или функцию. Очевидным примером lvalue будет имя объекта. Существуют операции, порождающие адреса, например, если E — одномерный массив, то E[0] — lvalue, соответствующее первому элементу из E.
При обсуждении всех операций указывается, применимы ли они к lvalue операндам, и порождают ли они сами lvalue.