| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
Ссылочные типы создают алиасы объектов и позволяют переда-
вать функциям аргументы по ссылке. Традиционно передача ар-
гументов в С выполняется только по значению. В С++ переда-
вать аргументы можно как по значению, так и по ссылке.
Полную информацию см. в разделе "Ссылки" на стр.98 оригина-
ла.
Массивы
Данный раздел начинает часть главы, посвященную расс-
мотрению грамматики структуры фраз языка; описание различий
между грамматическими правилами лексики и структуры фраз
языка см. на стр.4.
Объявление
type декларатор [<выражение-типа-константы>]
объявляет масив, состоящий из элементов типа type. Мас-
сив в С состоит из непрерывной области памяти, по размеру
позволяющей в точности разместить все его элементы.
Если в деклараторе массива задано выражение, то при
еговычислении должна получаться положительная целочисленная
константа. Получившееся значение представляет собой число
элементов массива. Каждый из элементовмассива нумеруется от
0 до числа элементов массива, минус единица.
Многомерные массивы создаются путем объявления массивов
из элементов типа массив. Таким образом, двумерный массив из
пяти строк и семи столбцов с именем alpha объявляется следу-
ющим образом:
type alpha [5] [7];
В определенном контексте первый декларатор массива из
нескольких может не иметь выражения в квадратных скобках.
- 58 -
Такой массив имеет неопределенный размер. Контекстом, где
допустимо такое положение, является тот случай, когдадля ре-
зервирования памяти размер массива не требуется. Например,
для объявление объекта типа массива extern точный размер
массива не требуется; не требуется он и при передаче функции
параметра типа массива. Будучи специальным расширением ANSI
C, Turbo C также позволяет объявлятьв качестве последнего
элемента структуры массив неопределенного размера. Такой
массив не увеличивает размера структуры, а для того, чтобы
обеспечить правильное выравнивание структуры, ее можно спе-
циально дополнить символами-заполнителями. Такие структуры
обычно используются при динамическом распределении памяти,
когда для правильного резервирования области памяти к разме-
ру структуры следует явно прибавить фактический размер необ-
ходимого массива.
За исключением использования массива в качестве операн-
да операции sizeof или &, выражение с типом массива
преобразуется в константу-указатель на первый элемент масси-
ва.
Функции
Функции представляют собой центральный вопрос програм-
мирования на Turbo C++. Такие языки программирования, как
Паскаль, делают различие между процедурами и функциями. В
Turbo C++ функции играют обе роли.
Объявления и определения
Каждая программа должна иметь одну внешнюю функцию
main, содержащую точку входа в программу. Обычно функции
объявляютсякак прототипы в стандартных или создаваемых поль-
зователем файлах заголовка, либо в файлах программы. По
умолчанию функции имеют тип extern, и доступ к ним возможен
из любого файла программы. Функция может быть ограничена
спецификатором класса памяти static (см. стр. 32 оригинала).
Функции объявляются в исходных файлах, либо делаются
доступными при компоновке с откомпилированными библиотеками.
В С++ вы должны всегда пользоваться прототипами функ-
ции. Мы рекомендуем также всегда использовать их и в С.
Данная функция может быть объявлена в программе нес-
колько раз, при условии, что эти объявлениясовместимы. Неоп-
ределяющие объявления функции, использующие формат прототипа
функции предоставляют Turbo C++ детальную информацию о пара-
метрах, что позволяет лучшее управление числом аргументов,
контролем их типа и преобразованиями типов.
За исключением перегрузки функции в С++, допустимым яв-
ляется только одно объявление данной функции в программе.
Объявления, если они имеются, должны соответствовать опреде-
лению функции. (Существенным различием между определением и
объявлением является то, что определение содержит собственно
тело функции.)
Объявления и прототипы
В оригинальном стиле объявлений Кернигэна и Ритчи функ-
ция могла быть либо объявлена неявно, по ее вызову, либо яв-
но:
func()
где type - это опциональный тип возврата, по умолчанию
- 59 -
равный int. Можно объявить функцию с любым типом возврата,
за исключениемтипов массива или функции. Такой подход не
позволяет компилятору контролировать соответствие типа или
количества используемыхпри вызове функции аргументов объяв-
лению.
Эта задача упрощается благодаря введению прототипа
функции со следующим синтаксисом объявления:
func(список-деклараторов-параметров)
При помощи IDE или опции компилятора командной строки
можно разрешить выдачу следующего предупреждения: "Function
called without a prototype" ("Функция вызывается без прото-
типа").
Деклараторы определяют типы каждого параметра функции.
Компилятор использует эту информацию для контроля достовер-
ности вызова функции. Компилятор также может приводить аргу-
менты к нужному типу. Предположим, что у вас имеется следую-
щий фрагмент кода:
long lmax(long v1, long v2); /* прототип */
main()
(*
int limit = 32;
char ch = 'A';
long mval;
mval = lmax(limit,ch): /* вызов функции */
Поскольку данная программа имеет прототип функции для
lmax, данная программа преобразовывает limit и ch к типу
long по стандартным правилам присвоения, прежде чем помес-
тить их в стекдля вызова lmax.Без прототипа функции limit и
ch были бы помещены в стек как целое и символьное значения,
соответственно; в этом случае стек, переданный lmax, не со-
ответствовал бы по размеру и содержимому тому, что ожидает
на входе lmax, что привело бы к возникновению проблем. Клас-
сический стиль объявлений не позволяет выполнять контроль
типа и числа параметров, поэтому использование прототипов
функций существенно упрощает отслеживаниепрограммных ошибок.
Прототипы функций также упрощают документирование кодов
программы. Например, функция strcpy принимает два параметра:
исходную строку и строку назначения. Вопрос, где какая из
них? Прототип функции
char *strcpy(char *dest, char *source);
проясняет этот вопрос. Если файл заголовка содержит
прототипы функций, вы можете распечатать этот файл и полу-
чить большую часть информации, которая нужна, чтобы написать
программу, использующую эти функции. Если включить в пара-
метры прототипа вашиидентификаторы, то они будут использо-
ваться только в сообщенях об ошибках, и только.
Декларатор функции в круглых скобках, содержащий единс-
твенное словоvoid, указывает на функцию, вообще не
принимающую аргументов:
func(void);
В С++ func() также означает функцию, не принимающую ар-
гументов.
stdarg.h содержит макросы, которые можно использовать в
функциях, определяемых пользователем, с переменным числом
- 60 -
параметров.
Прототип функции обычно объявляет функцию, принимающую
фиксированное число параметров. Для функции С, принимающей
переменное число параметров (например, printf) прототип
функции может заканчиваться многоточием (...), например:
f(int *const, long total, ...)
В случае данной формы прототипа фиксированные параметры
проверяются во время компиляции, а переменные параметры пе-
редаются без контроля типа.
Ниже приводятся примеры деклараторов функций и прототипы:
int f(); /* В С это функция, возвращащая int, без ин-
формации о параметрах. Это "классический стиль" Кернигэна и
Ритчи */
int f(); /* В С++ это функция, не принимающая аргументов */
int f(void); /* Функция, возвращающая int и не принима-
ющая параметров */
|
adfun.ru
|
|
|
|