Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab1-14.doc
Скачиваний:
11
Добавлен:
12.05.2015
Размер:
326.14 Кб
Скачать

3.2. Функции

Функциимогут использоваться для выполнения одинаковых или похожих последовательностей операторов. Эти последовательности операторов можно записать в том же исходном файле или отдельном исходном файле модуле и неоднократно обращаться к ней из главной функции и других функций.

Программы на языке C обычно состоят из большого числа маленьких функций, а не из нескольких больших. Программа может размещаться в одном или нескольких исходных файлах любым удобным образом; исходные файлы могут компилироваться отдельно и загружаться вместе наряду со скомпилированными ранее функциями из библиотек.

В программах на языке Cсуществуют три компонента работы с функциями:

  • объявление функции;

  • описание функции;

  • вызов функции.

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

Объявление функцииилипрототип функцииимеет следующий формат:

имя-типа описатель (список-объявлений);

где:

  • имя-типа– тип возвращаемого функцией значения (либо один из базовых типов, либоenum,struct,unionилиvoid). Функция не может возвращать массив или функцию, но может возвращать указатель на эти объекты. Если в качестве типа возвращаемого значения указывается ключевое словоvoid, то функция не возвращает никакого значения. Еслиимя-типаопущено, предполагается, что функция возвращает значение типаint;

  • описатель – либо имя функции (если возвращаемое значение имеет один из базовых типов или типvoid); либо указатель на возвращаемый тип (в этом случае возвращаемое функцией значение – указатель на данный тип или типvoid), либо (если возвращаемое значение типаenum,structилиunion) имя описанного ранее типа и имя функции или имя функции и список описаний элементов;

  • список-объявлений – список объявлений параметров вызова функции. Элементы списка отделяются друг от друга запятыми. Если список параметров не задан или список параметров состоит из одного ключевого словаvoid, это означает, что функция вызывается без параметров.

Концом списка-объявленийявляется символ ")", однако перед ней может быть записана запятая и многоточие – ",...". Это означает, что число аргументов функции является переменным, но не меньше, чем число параметров, заданных до многоточия. Если список параметров содержит только многоточие, то число параметров функции является переменным и может быть равным нулю.

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

  • идентификатор переменной может быть опущен (так называемое абстрактное описание типа). Для указателя в этом случае задается имя типа и символ "*". Если идентификатор задан, он используется просто для пояснения данного параметра и компилятором не используется (за исключением диагностических сообщений);

  • если параметр является массивом, количество элементов в массиве может быть опущено, т.е. задано в виде "[]" (для многомерных массивов таким образом можно задавать только первый индекс). В этом случае компилятор не проверяет верхнюю границу передаваемого в качестве аргумента массива;

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

  • в качестве параметра может быть указан обобщенный тип указателя. Этот тип обозначается "void *". При таком объявлении в качестве аргумента вызова может быть задан указатель на любой тип переменной.

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

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

имя-типа описатель (список-объявлений)

{

тело-функции

}

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

Определение функции в C не может содержать в свою очередь определения функции (запрещены вложенные функции). Однако функции Cмогут рекурсивно вызывать сами себя.

Вызов функциипередает управление и аргументы (если они есть) заданной функции. Оператор вызова функции имеет следующий вид:

имя-функции (арг-1, арг-2,...)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]