Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Определение функции






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

Формат определения:

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

{

тело функции

}

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

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

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

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

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

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

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

void fn(unsigned c, float b, int a, …); т. е. число аргументов функции fn³ 3.

Если функция не имеет параметров, то наличие круглых скобок обязательно, а вместо списка параметров рекомендуется указать слово void.

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

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

Пример передачи в функцию параметров-значений b и c:

int fn1(int b, float c);

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

В качестве такого параметра можно использовать указатель на некоторую переменную:

int fn2(int* pb);

Используя операцию косвенной адресации в теле функции, можно изменить значение этой переменной: *pb=6.

Другой способ передачи в функцию адреса переменной – передача параметра по ссылке, при этом в вызванной функции создается псевдоним исходной переменной, форма обращения к такому параметру-ссылке такая же, как и к обычной переменной, а сам параметр передается с помощью адреса, например, int fn3(int & ab); при этом обращение к переменной ab в теле функции fn3() такое же, как к обычной переменной типа int.

Тело функции – это составной оператор, содержащий объявления переменных (если необходимо), и операторы.

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

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

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

float root(x, E)

float x, E;

{

тело функции

}

В новом стиле типы параметров указываются в списке параметров:

float root(float x, float E)

{

тело функции

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.