Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / C_II_семестр / 11-1_ФУНКЦИИ_1

.pdf
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
95.27 Кб
Скачать

Основы программирования. Функции часть1

1

ФУНКЦИИ

Общие сведения о функциях

Функция - это независимая совокупность объявлений и операторов, обычно предназначенная для выполнения определенной задачи. Программы на Си состоят по крайней мере из одной функции - main.

ВСи функция является одним из производных типов и в то же время минимальным исполняемым модулем программы. Каждая программа на языке С – это совокупность функций, каждая из которых должна быть определена или по крайней мере описана до ее использования в конкретном модуле программы.

ВСи функции следующий формат:

[<класс_памяти>][<тип>]<имя_функции> ([<спецификация _параметров>]) <тело_функции>

Пример вычисления гипотенузы прямоугольного треугольника:

extern double Pifagor(double a, double b) {return a*a+b*b};

Спецификатор класса памяти <класс_памяти> задает класс памяти функции, который может быть или static или extern. Спецификатор типа <тип> и декларатор <имя_функции> специфцируют тип возврата и имя функции. Список параметров <спецификация _параметров> - это список (возможно пустой) формальных параметров, которые используются функцией. Тело функции <тело_функции> - это составной оператор, содержащий объявления локальных переменных и операторы.

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

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

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

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

Спецификация параметров - это либо пусто, либо список формальных параметров, каждый элемент которого имеет вид: обозначение _типа имя_параметра

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

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

Если функция возвращает значение, то обязательным оператором тела функции является оператор возврата из функции в точку вызова: return выражение;

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

Если в определении указан тип void – то возврат из тела функции осуществляется оператором return. Оператор return для void функции можно опустить, тогда компилятор автоматически его добавит в конец тела функции перед закрывающейся фигурной скобкой "}".

Также допустима старая (нежелательная) форма:

[<класс_памяти>][<тип>]<имя_функции> ([<спецификация _параметров>]) [<типы_формальных_параметров>] <тело_функции>

Выше показанный пример перепишется следующим образом: extern double Pifagor(a, b)

double a; double b; {return a*a+b*b};

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

Прототип функции. Каждая из функций должна быть определена или по крайней мере описана до

Основы программирования. Функции часть1

2

своего использования ( т.е. компилятору должны быть известны сведения о функции) определения и описания функции размещаются обычно в том же файле где функция используется. Рекомендуется объявления функций (прототипы) выносить в отдельные заголовочные файлы с расширением «h». Прототип функции имеет вид:

класс_памяти тип имя_функции (спецификация _параметров);

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

double Pifagor(double a, double b); double Pifagor(double, double);

Вызов функции. Для обращения к функции используется выражение с операцией "круглые скоб-

ки":

обозначение_функции (список_фактических_параметров);.

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

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

Между формальными и фактическими параметрами должно быть соответствие по типам. Лучше всего, когда тип фактического параметра совпадает с типом формального параметра. В противном случае компилятор автоматически добавляет команды преобразования типов, что возможно только в том случае, если такое приведение типов допустимо.

Например, обращение к функции Pifagor следующего вида Pifagor(3, 4) будет преобразовано в

Pifagor((double) 3, (double) 4);

Передача параметров

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

Передача параметров по значению предусматривает следующие шаги:

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

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

3.Значения выражений - фактических параметров заносятся в участки памяти, выделенные для формальных параметров функции. При этом float преобразуется в double, a char и short int

-в тип int .

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

5.Никакого влияния на фактические параметры (на их значения) функция не оказывает.

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

граммы зависит от типа возвращаемого функцией значения. Если в качестве типа возвращаемого значения указан тип void, то функция является функцией без возвращаемого результата. Такая функция не может входить ни в какие выражения, требующие значения, а должна вызываться в виде отдельного выражения-оператора: обозначение_функции (список_фактических_параметров);.

Соседние файлы в папке C_II_семестр