Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Функции не возврошающие значени




Способы передачи параметров в функцию

Очередность вызова и рекурсия

Одна функция может вызываться внутри другой.

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

Возможна и сложная (вложенная) рекурсия когда, например, функция А вызывает функцию В, а функция В — функцию А.

Пример простой рекурсии (функция вызывает саму себя):

int fib(int n) {

if(n == 1 || n == 2) {

return 1;

} else {

return fib(n-1) + fib(n-2);

}

}

 

int main(void) {

cout << fib(10); // 55

return 0;

}

Основной недостаток рекурсии — повторные вычисления одних и тех же значений.

Пример: чтоб вычислить пятое число Фибоначчи по рекурсивному алгоритму, надо вычислить четвёртое и третье числа Фибоначчи. Чтобы вычислить четвёртое — надо вычислить второе и третье, хотя третье мы уже считали для вычисления пятого.

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

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

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

1.Из тела функции нельзя обратиться к какому-либо объекту, если он не является глобальным по отношению к функции или если его имя перекрыто одноимённой локальной переменной.

2.При передаче больших объектов происходит их копирование и часто память расходуется напрасно.

Для снятия таких ограничений существует возможность передачи параметра по ссылке.

В этих случая в функцию передаётся адрес объекта и, соответственно, работа внутри функции происходит не с копией, а с оригиналом объекта.

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

В программировании тип возвращаемого значения (англ. return type) или тип результата (англ. result type) определяет и накладывает ограничения на тип данных, возвращаемых методомили функцией. Во многих языках программирования(особенно это касается языков со статической типизацией, как например, Java, C++и Си) возвращаемый тип должен быть явно указан при объявлении функции.

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

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

Также в языке Си предусмотрена возможность возврата функцией указателя. Чтобы функция могла возвратить указатель, она должна быть объявлена как возвращающая указатель на нужный тип. То есть, тип возвращаемого указателя должен декларироваться явно. Например, нельзя объявлять возвращаемый тип как int *, если возвращается указатель типа char *. В случае необходимости возврата «универсального» указателя (то есть указателя, который может указывать на данные любого типа) тип результата функции следует определить как void *[1].

 




Поделиться с друзьями:


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


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



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




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