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

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

Читайте также:
  1. HopeLab и программа gDitty меняют поведение детей через развлечения
  2. I. Снижение контрастности между фигурой и фоном.
  3. II. Метод стандартного обмена
  4. II. Параметры оценивания
  5. II. Различие между свободой и неволей
  6. II. Сведения о работах, на выполнение которых осуществляется закупка,
  7. III. Установите соответствие между фамилиями деятелей культуры XIX в. и сферами их деятельности.

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

Функция возвращает значение с помощью оператора

return выражение; или return;.

Выражение в операторе return должно иметь тот же тип что и тип функции. Если функция имеет тип void, то этот оператор можно опустить.

Пример, int sum(int a, int b) {return a+b;}

В функции может быть несколько операторов return, если предусматривается несколько ветвей.

Например, функция, вычисляющая x в степени y.

float pow (int, int);

void main ()

{

printf("%f", pow(2, -2));

getch();

}

 

float pow (int x, int y)

{

if (!y) return 1;

if (y>0)

{

int p=1;

for (int i=1; i<=y; i++) p*=x;

return p;

}

float p=1;

for (int i=1; i<=(-y); i++) p/=x;

return p;

 

}

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

Например, функция вычисляющая сумму элементов массива

int Sum(int *mas, int n)

{

int summ=0;

for (int i=0; i<n; i++)

summ+=mas[i];

return summ;

}

void main()

{

const int n=3;

int r[n];

randomize();

for (int i=0; i<n; i++)

{

r[i]=random(6);

printf(" %d",r[i]);

}

printf("\nSum = %d, Sum(r, n));

getch();

}

 

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

Рассмотрим подробно механизм работы функций.

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

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

3. Каждому формальному параметру присваивается значение соответствующего фактического параметра (т.е функции всегда работает с копиями фактических параметров).

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

5. Управление передается на первый оператор тела функции

6. Оператор return извлекает из стека сохраненный адрес и передает на него управление вместе с возвращаемым функцией значением.

 

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

bool F (int r, int w);

F(178, 65); синтаксически и семантически верно

F(65, 178); синтаксически верно, но семантически не верно

int *a=NULL; F(a, 178); - синтаксически не верно

 

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

int f (int a) {a++; return a;};

void main ()

{

int n=10;

printf("%d%d%d", n, f(n), n);//10 11 10

}

 

 

Перечислим некоторые особенности функций в С.

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

Например,

int sum (int a=1, int b=2)

{return a+b;}

sum();//3

sum(10)//12

sum(10,5)//15

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

2. Допустимы функции, количество параметров у которых при компиляции определения функции не определено, в этом случае в определении функции в конце списка параметров после запятой ставится многоточие.

тип имя (список параметров, …);

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

 

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

# include “имя файла”

включают в начало каждого из модулей программы.

 


Дата добавления: 2015-11-30; просмотров: 39 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.006 сек.)