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

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

Turbo C++ Version 1.0 Programmer’s Guide

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

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

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

Предварительные определения

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

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

int x;
int x; /* допустимо, резервируется одна копия x */

int y;
int y = 4; /* допустимо, y инициализируется значением 4 */

int z = 5;
int z = 6; /* недопустимо, т.к. оба определения
инициализированы */
Возможные объявления

В число объектов, которые могут быть объявлены, входят:

— переменные
— функции
— классы и компоненты классов (С++)
— типы
— теги структур, объединений и перечислимых данных
— компоненты структур
— компоненты объединений
— массивы прочих типов
— перечислимые константы
— метки операторов
— макросы препроцессора

Полный синтаксис объявлений показан в следующих табли-

— 35 —
цах. Рекурсивная природа синтаксиса описателей позволяет
создавать сложные описатели. Для улучшения читаемости мы
пошли на использование определяемого типа (typedef).

Синтаксис объявлений Turbo C++ Таблица 1.10
————————————————————
объявление:

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

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

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

спецификатор-класса-памяти:
auto
register
static
extern

спецификатор-функции: (только для С++)
inline
virtual

спецификатор-типа:
имя-простого-типа
спецификатор-класса
спецификатор-перечислимых-данных
спецификатор-усовершенствованного-типа
const
volatile

имя-простого-типа:
имя-класса
имя-typedef
char
short
int

long
signed
unsigned
float
double
void

спецификатор-усовершенствованного-типа:
ключ-класса идентификатор
ключ-класса имя-класса
enum имя-перечислимых-данных

ключ-класса: (только для С++)
class
struct
union

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

— 36 —
нумератор:
идентификатор
идентификатор = выражение-типа-константы

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

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

список-объявления:
объявление
список-объявления объявление
————————————————————

Для следующей таблицы отметим, что на количество и по-
рядок модификаторов и квалификаторов наложены ограничения.
Кроме того, перечисленные модификаторыявляются единственным-
дополнением синтаксиса декларатора, не входящим в стандарт
ANSI C и С++. Каждый модификатор подробно описан, начиная со
стр.46 оригинала.

Синтаксис декларатора Turbo C++ Таблица 1.11
————————————————————
список-декларатора:
инициализатор-декларатор
список-декларатораинициализатор-декларатор

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

(список-со-квалификаторов — только для С++)
декларатор []

список-модификаторов:
модификатор
список-модификаторов модификатор

модификатор:
cdecl
pascal
interrupt
near
far
huge

операция-указателя:
*
& (только для С++)
имя-класса = * (только для C++)

список-со-квалификаторов:
со-квалификатор

со-квалификатор:
const
volatile

имя-декларатора:
имя
имя-класса (только для С++)
имя-класса (только для С++)
имя-typedef

— 37 —

имя-типа:
спецификатор-типа

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

[]

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

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

— 81 —

Округление всегда выполняется к нулю.
Операции типа сложения

Существует две операции типа сложения: + и -. Синтаксис
этих операций следующий:

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

Операция сложения +

Допустимыми являются следующие типы операндов выражения
операнд1 + операнд2:

1. Операнд1 и операнд2 оба арифметического типа.

2. Операнд1 интегрального типа, а операнд2 является
указателем на объект.

3. Операнд2 интегрального типа, а операнд1 является
указателем на объект.

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

Операция вычитания —

Допустимыми являются следующие типы операндов выражения
операнд1 — операнд2:

1. Операнд1 и операнд2 оба арифметического типа.

2. Оба операнда являются указателями на совместимые ти-
пы объектов. (Примечание: неквалифицированный тип type расс-
матривается как совместимый с квалифицированными типами
const type, volatile type и const volatile type.)

3. Операнд2 интегрального типа, а операнд1 является
указателем на объект.

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

Операции поразрядного сдвига

Существует две операции поразрядного сдвига: >.
Синтаксис этих операций следующий:

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

Операция поразрядного сдвига влево > E2 операнды Е1 и Е2 должны иметь тип
int. С Е1 и Е2 выполняются обычные целочисленные действия, а
тип результата определяется операндом Е1. Если Е2 отрицате-
лен, либо по числу разрядов больше или равен Е1, то операция
неопределена.

Результатом операции E1 >> E2 является значение E1,
сдвинутое вправо на Е2 разрядов. Если Е1 имеет тип unsigned,

то при необходимости происходит его заполнение нулями слева.
Если же Е1 имеет тип signed, то заполнение слева выполняется
знаком (0 для положительных и 1 для отрицательных значений).
Такое расширение знакового бита гарантирует, что знак у Е1
>> E2 будет таким же, как и у E1. За исключением типов со
знаком, значение E1 >> E2 представляет собой целую часть
частного.

Операции отношения

Существует четыре операции отношения: < > =. Син-
таксис этих операций следующий:

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

Операция меньше чем < В выражении E1 < E2 операнды должны удовлетворять одно- му из следующего набора условий: 1. Оба значения Е1 и Е2 - арифметического типа. 2. Оба значения Е1 и Е2 являются указателями квалифици- рованных или неквалифицированных версий совместимых типов объектов. Определение квалифицированных имен дается на стр.108 оригинала. 3. Оба значения Е1 и Е2 являются указателями квалифици- рованных или неквалифицированных версий совместимых неполных типов. В случае 1 выполняются обычные арифметические преобра- зования. Результат E1 < E2 имеет тип int. Если значение E1 меньше значения E2, то результат равен 1 (истина); в против- - 83 - ном случае результат равен 0 (ложь). В случаях 2 и 3, где Е1 и Е2 являются указателями сов- местимых типов, результат операции E1 E2 дает 1 (истина), если значение Е1 больше значения Е2;в противном случае результат равен 0 (ложь), причем используются те же способы интерпретации арифметических сравнений и сравнений указателей, что опреде- лены для операции "больше чем". К операндам применимы те же правила и ограничения. Операция меньше или равно = E2 дает 1 (истина), если значение Е1 больше или равно значению Е2. В противном случае результат равен 0 (ложь), причем используются те же способы интерпретации арифметических сравнений и сравнений указате- лей, что определены для операции "меньше чем". К операндам применимы те же правила и ограничения. Операции типа равенства Существует две операции типа равенства: == и !=. Они проверяют условие равенства операндов арифметического типа и типа указателей, следуя при этом правилам, аналогичным тем, что действуют для операцийотношения. Отметим, однако, что == и != имеют более низкий приоритет выполнения, чем операции отношения , =. Кроме того, операции == и != позво- ляют выполнять проверку равенства указателей в таких случа- ях, где операции отношения неприменимы. Синтаксис этих опе- раций следующий: выражение-типа-равенства:

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

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

Операция проверки равенства ==

В выражении E1 == E2 операнды должны удовлетворять

— 84 —
одному из следующего набора условий:

1. Оба значения Е1 и Е2 — арифметического типа.

2. Оба значения Е1 и Е2 являются указателями квалифици-
рованных или неквалифицированных версий совместимых типов.

3. Одно из значений, Е1 или Е2, является указателем
объекта неполного типа, а второй — указателем на квалифици-
рованную или неквалифицированную версию void.

4. Одно из значений, Е1 или Е2, является указателем, а
второе — константой типа пустого указателя.

Если Е1 и Е2 имеют тип, являющийся допустимым типом для
операций отношения, то применимы правила, подробно описанные
для операций отношения типа Е1 < E2, E1

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

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

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

Операции присвоения

Существует одиннадцать операций присвоения. самым
простым из них является операция =; остальные называются
составными операциями присвоения.

— 87 —
Синтаксис операций присвоения следующий:

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

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

Простая операция присвоения =

В выражении Е1 = Е2 Е1 должен быть модифицируемым име-
нующим выражением. Значение Е2 после преобразования к типу
Е1 помещается в объект, задаваемый Е1 (замещая предыдущее
значение Е1). Значение выражнения присвоения это значение Е1
после присвоения. Само по себе выражение присвоения не явля-
ется именующим значением.

ОперандыЕ1 и Е2 должны удовлетворять одному из следую-
щего набора правил:

1. Е1 имеет квалифицированный или неквалифицированный
арифметический тип, а Е2 имеет арифметический тип.

2. Е1 имеет квалифицированную или неквалифицированную
версию типа структуры или объединения, совместимого с типом
Е2.

3. Е1 и Е2 это указатели на квалифицированную или нек-
валифицированную версии совместимых типов , а тип, на кото-
рый указывает левый операнд, имеет все квалификаторы типа,
на который указывает правый операнд.

4. Один из операндов, Е1 или Е2, является указателем
объектаили неполного типа, а другой — указвтелем на квалифи-
цированную или неквалифицированную версию void. Тип, на ко-
торый указываетлевый операнд, имеет все квалификаторы типа,
на который указывает правый операнд.

5. Е1 является указателем, а Е2 — константой типа пус-
того указателя.

Составные операции присвоения

Составные операции вида операция=, где «операция» — это
один из десяти символов операции * / % + — > & ^ \!, ин-
терпретируются следующим образом:

Е1 операция= Е2

имеет тот же эффект, что и

Е1 = Е1 операция Е2

за исключением того, что именующее значение Е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

— 43 —

Методы стандартных арифметических преобразований Таблица 1.15
————————————————————
Тип Преобразование вМетод
————————————————————
char intРасширение нулем или знаком
(в зависимости от умолчания
для типа char)

unsigned char intЗаполнение старшего байта
нулем (всегда)

signed char intРасширение знаком (всегда)

short intТо же значение

unsigned short unsigned int То же значение

enum intТо же значение
————————————————————

Специальные преобразования типов char, int и enum

Обсуждаемые в данном разделе преобразования специфичны
для Turbo C++.

Присваивание объекта типа signed char (например,пере-
менной) интегральномуобъекту вызывает автоматическое расши-
рение знаком. Объекты типа signed char используетрасширение
знаком всегда; объекты типаunsigned charпри преобразовании
вint всегда устанавливают старший байт в ноль.

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

Инициализация

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

— нулем, если это объект арифметического типа
— null, если что указатель

В случае автоматического распределения памяти исходное
значение динамической локальной переменной непредсказуемо.

Синтаксис инициализаторов следующий:
инициализатор
= выражение
= (*список-инициализаторов*)*)
(список выражений)

список-инициализаторов
выражение
список-инициализаторов, выражение
(*список-инициализаторов*)*)

Ниже приводятся правила, управляющие инициализаторами:

— 44 —

1. Число инициализаторов в списке инициализаторов не
может превышать число инициализируемых объектов.

2. Инициализируемый элемент должен быть типа объекта
или массивом неизвестной размерности.

3. Все выражения должны являться константами, если они
находятся в одном из следующих мест:

а. в инициализаторе объекта, имеющего статическую дли-
тельность (в Turbo C++ не требуется)

b. в списке инициализаторов для массива, структуры или
объединения (также допустимы выражения с использованием
sizeof)

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

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

памяти.

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

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

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

Массивы, структуры и объединения

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

int days[7] = (* 1, 1, 1, 1, 1, 1, 1)

Этими правилами можновоспользоваться для инициализации
символьных массивов и широких символьных массивов:

1. Можно инициализировать массивы символьного типа с
помощью строки литералов, опционально заключенной в фигурные
скобки. Каждый символ строки, включая нулевой терминатор,

— 45 —
инициализирует последовательно расположенные элементы масси-
ва. Например, вы могли объявить:

char name[] = (* «Unknown» *);

установив тем самым массив из восьми элементов, элемен-
ты которого равны ‘U'(для name[0]), ‘n’ (для name[1]), и
т.д. (включая нулевой терминатор.)

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

Ниже приводится пример инициализации структуры:

struct mystruct (*
int i;
char str[21];
double d;
*) s = (* 20, «Borland», 3.14 *);

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

Простые объявления

Простые объявления идентификаторов переменных имеют
следующий шаблон:

тип-данных перем1 , перем2 ,…;

где перем1, перем2, … это произвольная последователь-
ность отдельных идентификаторов с опциональными инициализа-
торами. Каждая из переменных объявляется с указанным ти-
пом-данных. Например,

int x = 1, y = 2;

создает две целочисленных переменных x и y (и
инициализирует их значениями 1 и 2, соответственно).

Это былиобъявления определения; при этом распределялась
память и выполнялась инициализация.

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

В 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

Спецификаторы класса памяти

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

auto register typedef
extern static

— 46 —

Использование спецификатора класса памяти auto

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

Использование спецификатора класса памяти extern

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

Использование спецификатора класса памяти register

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

Turbo C++ позволяет вам выбрать опции размещения пере-
менных в регистрах в диалоговом поле Options \! Compiler \!
Optimization. При выборе опции Automatic TurboC++ сделает
попытку распределить регистры даже еслиспецификаторы класса
памяти register не задавались.

Использование спецификатора класса памяти static

Спецификатор класса памяти static может использоваться
в объявлениях функций и переменных с контекстом файла и ло-
кальным контекстом для обозначения внутреннего типакомпонов-
ки. Static также указывает, что переменная должна иметьста-
тическую продолжительность существования. При отсутствии
конструкторовили явныхинициализаторов статические переменные
инициализируются 0 или null.

В С++ компоненты класса,статические данные, имеет то же
значение длявсех вхождений класса. Члены класса, статические
функции, не зависят от других вхождений класса.

Использование спецификатора класса памяти typedef

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

static long int biggy;
typedef long int BIGGY;

Первое объявление создает 32-битовый объект типа long
int, со статической продолжительностью существования и име-
нем biggy. Второе объявление устанавливает идентификатор
BIGGY в качестве спецификаторановоготипа, не создавая при

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

extern BIGGY salary;

имеет тот же эффект, что и

extern long int salary;

Хотя данный простой пример может быть равным образом
реализован при помощи #define BIGGY long int, в более слож-
ных случаях typedef позволяет добиться большего, нежели с
помощью текстовых подстановок.

Важное замечание!

typedef не создает новых типов данных; это ключевое

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

typedef double (*PFD)();
PFD array-pfd[10];
/* array_pfd это массив из 10 указателей на функции,
возвращающие значения типа double */

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

unsigned BIGGY pay; /* НЕДОПУСТИМО */
Модификаторы

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

Модификаторы Turbo C++ Таблица 1.16
————————————————————
Модификатор Используется с Использование
————————————————————
const Только переменными Предотвращает изменения объекта

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

В С++ const и volatile расширены и включают классы и
функции.

Расширения Turbo C++

cdecl Функции Устанавливает соглашения С пере-
дачи аргументов

cdecl Переменные Устанавливает учет регистра иден-
тификатора и ведущие знаки подчер-
кивания

pascal Функции Устанавливает соглашения пере-
дачи аргументов Паскаля

pascal Переменные отменяет учет регистра идентифи-

— 48 —
катора и ведущие знаки подчерки-
вания

interrupt Функции Функция компилируется с дополни-
тельным кодом управления реги-
стром, необходимыми при написании
обработчиков прерываний

near, Переменные Переопределяет умолчание типа
far, указатели указателя, задаваемое текущей
huge моделью памяти

_cs, Переменные Указатели сегмента;
_ds, указатели см. стр.199 оригинала
_es,
_seg,
_ss

near, Функции Переопределяет умолчание типа
far, функции, задаваемое текущей
huge моделью памяти

near, Переменные Определяет размещение объекта в
far, памяти

_export Функции Только OS/2. Turbo C++ это
игнорирует

_loadds Функции Устанавливает регистр DS на
текущий сегмент данных

_saveregs Функции Предохраняет все значения регис-
тров (кроме значений возврата)
во время выполнения функции
————————————————————
Модификатор const

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

const float pi= 3.1415926;
const maxint = 32767;
char *const str= «Hello, world!»; // указатель константа
char const *str2= «Hello, world!»; // указатель на
константу

Использование одного только модификатораconst эквива-
лентно const int.

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