Книга: Язык Си - руководство для начинающих

В ЯЗЫКЕ СИ ВСЕ ФУНКЦИИ РАВНОПРАВНЫ

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

     Нет ли у функции main( ) какой-то специфики? Безусловно, есть; она заключается в том, что после "сборки" программы, состоящей из нескольких функций, ее выполнение начинается с первого оператора функции main( ). Но этим ее исключительность и граничивается. Даже функция main( ) может быть вызвана другими функциями, как показывает приведенный ниже пример:

/* вызовфункции main( ) */

#include      

main( )

{

char ch;

printf (" Укажите произвольный символ. Q - признак конца работы. n");

ch = getchar( );

printf ("Так! Вы указали %с!n", ch);

if(ch != 'Q') more( );

}

more( );

{

main( );

}

Функция main( ) вызывает more(), а функция more() вызывает main()! После вызова функции main( ) ее выполнение начинается с самого начала; мы организовали цикл с взаимным вызовом.

     Функция может даже вызывать сама себя. Упростим предыдущий пример следующим образом:

/* main.main */

#include

main( )

{

char ch;

printf (" Укажите произвольный символ. Q - признак конца работы.n");

ch = getchar( );

printf ("Так! Вы указали %с!n", ch);

if(ch != 'Q') main( );

}

     Ниже приводятся результаты одного прогона программы, показывающие, что она работает. Обратите внимание на то, как обрабатывается символ "новая строка", который передается программе при нажатии клавиши [ввод].

Введите произвольный символ. Q - признак конца работы.

I

Так! Вы указали I !

Введите произвольный символ. Q - признак конца работы.

!

Так! Вы указали ! !

Введите произвольный символ. Q - признак конца работы.

Q

Так! Вы указали Q !

     Действие, состоящее в том, что функция вызывает сама себя, называется "рекурсией". Цикл, который мы создали, используя рекурсию, отличается от циклов while и do while. Когда функция main( ) вызывает сама себя, не происходит передачи управления на ее начало. Вместо этого в памяти машины создаются копни всего набора переменных функции main( ). Если вы выведете на печать адреса переменных в обычном цикле, то увидите, что эти адреса не изменяются от итерации к итерации. Что же касается рассматриваемого здесь цикла, то в нем адрес используемой переменной меняется, поскольку при каждом выполнении тела цикла создается новая копия переменной ch. Если программа циклически выполняется 20 раз, то будет создано 20 различных копий переменной, каждая из которых носит имя ch, но имеет свой собственный адрес.

Оглавление книги


Генерация: 4.951. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз