Студопедия

КАТЕГОРИИ:


Архитектура-(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() можно было записать в следующем виде:

/* Устаревший стиль*/
main(void)

Стандарт С99 не поддерживает принцип неявного int. Поэтому в заголовке функции main() следует в явном виде указать тип возвращаемого значения:

/* Современный стиль */
int main(void)

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

return [ выражение ];

Порядок выполнения этой инструкции состоит в следующем:

· Вычисляется значение элемента выражение.

· Завершаются вычисления в функции.

· Создается временный объект, тип которого определяется типом, указанным в спецификации типа заголовка функции.

· Во временный объект переписывается вычисленное значение элемента выражение. При этом могут выполняться предусмотренные языком автоматические преобразования типа.

· Управление передается в точку вызова.

 

В языке Си средством обращения к функции является вызов функции. Вызов функции имеет следующий формат:

имя ([ список_фактических_параметров ])

Вызов функции содержит три структурных элемента. Два из них являются обязательными, а один нет. Вызов функции начинается с обязательного элемента имя. Этот элемент определяет имя функции, к которой выполняется вызов. Вторым обязательным элементом вызова функции является оператор функция, в качестве которого в языке Си используется пара круглых скобок. Наличие этого оператора делает расположенный перед ними идентификатор именем функции. Последний элемент вызова список_фактически_параметров относится к категории необязательных элементов. Фактические параметры наряду с формальными параметрами, которые содержатся в заголовке определения функции, служат для организации обмена данными между функцией и вызвавшим ее программным кодом (между функцией и ее клиентом). Фактические и формальные параметры должны быть согласованы по количеству, порядку следования и типам. Фактические параметры имеют синтаксис выражений. Приведем примеры вызовов для функции max2(), определение которой было написано выше. Пусть объявлены три переменных типа double a, b и с. Тогда можно написать следующие вызовы рассматриваемой функции:

max2(3.0, 4.0)
max2(a, b)
max(a * a + 5, b + 3)
max2(max2(a, b), c)

Таким образом, при работе с функцией max2() ее аргументами могут быть константы, переменные, арифметически выражения и даже вызовы самой функции max2().

Теперь перейдем к рассмотрению вопроса о том, где располагать вызов функции в клиентском коде. Возможны два варианта использования вызова функции в ее клиентском коде. В первом варианте вызов функции используется либо в качестве операнда выражения, либо в качестве фактического параметра функции. Такая возможность открывается в том случае, когда функция имеет возвращаемое значение. Примером такой функции является рассматриваемая функция max2(). В том случае, кода возвращаемым типом является тип void (это равносильно тому, что функция не имеет возвращаемого значения) вызов функции можно использовать только в составе инструкции – выражения. Примером такой функции может служить библиотечная функция clrscr():

int main(void)
{
clrscr();
/* … */
}

Опишем порядок выполнения вызова функции.

1. Вычисления в точке вызова временно прерываются. Запоминается точка возврата и состояния некоторых регистров процессора.

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

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

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

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

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

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

#include<stdio.h>
#include<conio.h>

double max2(double a, doubl e b)
{
double max;
if (a > b)
max = a;
else
max = b;
return max;
}

int main(void)
{
double a, b, с;
printf(“a=”);
scanf(“%lf”, &a);
printf(“b=”);
scanf(“%lf”, &b);
printf(“с=”);
scanf(“%lf”, &с);

printf(“max(a, b)=%10.3f\n”, max2(a, b));
printf(“max(a * a + 5, b + 3)=%10.3f\n”,
max(a * a + 5, b + 3));
printf(“max(3.0, 5.0)=%10.3f\n”, max2(3.0, 4.0));
printf(“max(a, b, c)=%10.3f\n”, max2(max2(a, b), c));
return 0;
}

<== предыдущая лекция | следующая лекция ==>
Определение функции | Понятие о прототипе. Компиляция
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 525; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.