КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Вызов функции. Передача параметров по значению
Функции, возвращающие и невозвращающие значение В некоторых языках, например в языке Паскаль, различают две вида подпрограмм: · Подпрограммы – процедуры. · Подпрограммы – функции. В языке Си имеется все лишь один вид подпрограмм – функция. Однако такая функция может играть роль, как подпрограммы – процедуры, так и подпрограммы – функции языка Паскаль. Дело в том, что функция языка Си может возвращать значение, а может его не возвращать. Функция языка Си, не имеющая возвращаемого значения, играет роль процедуры, а возвращающая значение – роль функции языка Паскаль. Указанием на отсутствие у функции языка Си возвращаемого значения является использование в ее заголовке в качестве спецификатора типа, возвращаемого значения, зарезервированного слова void. Примером такой функции является библиотечная функция clrscr(), прототип которой имеет следующий вид: voi d clrscr(void); Примером функции, возвращающей значение, является библиотечная функция sqrt(), прототип которой имеет следующий вид: double sqrt(double); Заметим, что на ранних этапах использования языка Си широко применялся принцип неявного int. Существо этого принципа сводится к следующему. В тех случаях, когда отсутствует указание на тип объекта или функции, то по умолчанию предполагается наличие спецификатора типа int. Использование этого принципа позволяло повысить компактность записи объявлений и определений. Например, заголовок функции main() можно было записать в следующем виде: /* Устаревший стиль*/ Стандарт С99 не поддерживает принцип неявного int. Поэтому в заголовке функции main() следует в явном виде указать тип возвращаемого значения: /* Современный стиль */ Значение, возвращаемое функцией, формируется с помощью инструкции return, которая должна иметь следующий формат: return [ выражение ]; Порядок выполнения этой инструкции состоит в следующем: · Вычисляется значение элемента выражение. · Завершаются вычисления в функции. · Создается временный объект, тип которого определяется типом, указанным в спецификации типа заголовка функции. · Во временный объект переписывается вычисленное значение элемента выражение. При этом могут выполняться предусмотренные языком автоматические преобразования типа. · Управление передается в точку вызова.
В языке Си средством обращения к функции является вызов функции. Вызов функции имеет следующий формат: имя ([ список_фактических_параметров ]) Вызов функции содержит три структурных элемента. Два из них являются обязательными, а один нет. Вызов функции начинается с обязательного элемента имя. Этот элемент определяет имя функции, к которой выполняется вызов. Вторым обязательным элементом вызова функции является оператор функция, в качестве которого в языке Си используется пара круглых скобок. Наличие этого оператора делает расположенный перед ними идентификатор именем функции. Последний элемент вызова список_фактически_параметров относится к категории необязательных элементов. Фактические параметры наряду с формальными параметрами, которые содержатся в заголовке определения функции, служат для организации обмена данными между функцией и вызвавшим ее программным кодом (между функцией и ее клиентом). Фактические и формальные параметры должны быть согласованы по количеству, порядку следования и типам. Фактические параметры имеют синтаксис выражений. Приведем примеры вызовов для функции max2(), определение которой было написано выше. Пусть объявлены три переменных типа double a, b и с. Тогда можно написать следующие вызовы рассматриваемой функции: max2(3.0, 4.0) Таким образом, при работе с функцией max2() ее аргументами могут быть константы, переменные, арифметически выражения и даже вызовы самой функции max2(). Теперь перейдем к рассмотрению вопроса о том, где располагать вызов функции в клиентском коде. Возможны два варианта использования вызова функции в ее клиентском коде. В первом варианте вызов функции используется либо в качестве операнда выражения, либо в качестве фактического параметра функции. Такая возможность открывается в том случае, когда функция имеет возвращаемое значение. Примером такой функции является рассматриваемая функция max2(). В том случае, кода возвращаемым типом является тип void (это равносильно тому, что функция не имеет возвращаемого значения) вызов функции можно использовать только в составе инструкции – выражения. Примером такой функции может служить библиотечная функция clrscr(): int main(void) Опишем порядок выполнения вызова функции. 1. Вычисления в точке вызова временно прерываются. Запоминается точка возврата и состояния некоторых регистров процессора. 2. Управление передается вызываемой функции. В стеке выделяется память для формальных параметрах и локальных переменных. 3. Вычисляются значения фактических параметров, и формальные параметры функции инициализируются вычисленными значениями, соответствующих им фактических параметров. Операцией инициализации ограничивается взаимосвязь между формальными и фактическими параметрами. 4. Начинает выполняться тело функции. Выполнение функции завешается в момент времени, когда встречается инструкция return. Если функция не имеет возвращаемого значения, то в ее теле может отсутствовать инструкция return. В этом случае вычисления заканчиваются в том момент, когда управление достигает закрывающей скобки тела функции. 5. Память, выделенная функции в стеке, освобождается. Восстанавливается исходное состояние процессора. Управление передается в точку вызова функции. Отметим одну особенность передачи параметров по значению. Эта особенность состоит в том, что для возврата результата, полученного в функции, необходимо в качестве формального параметра указатели (см. пункт 1.36.8). Дело в том, что при использовании передачи по значению через параметры данные передаются только в функцию. Применение указателей в качестве параметров функции позволяет организовать дополнительный канал связи между вызывающей и вызываемой функциями. Обратимся к примеру. Воспользуемся приведенным выше определением функции max2(). Напишем для этой функции тестовую программу. #include<stdio.h> double max2(double a, doubl e b) int main(void) printf(“max(a, b)=%10.3f\n”, max2(a, b));
Дата добавления: 2014-01-06; Просмотров: 525; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |