Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

18.3. Формальные и фактические параметры функции

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

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

void prnErr() { // void prnErr(void)

printf(“Ошибка!”);

}

Аргументы, передаваемые функции при ее вызове, называются фактическими параметрами. Фактические параметры – это то, что стоит на самом деле при вызове функции. А при вызове функции в качестве фактических параметров могут стоять: имена переменных (такие же или совершенно другие), выражения или просто константы.

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

Обратить внимание! Тип должен указываться для каждого формального параметра в отдельности:

int sum(int a, b) { // ошибка

...

}

18.4. Вызов функции

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

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

s = sum(a,b); // вызов функции c параметрами

printErr(); // вызов функции без параметров – скобки () обязательны !!!

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

Вызов функции не может находиться в левой части оператора присваивания. Выражение sum(x,y)=100; является неправильным.

void main() {

int x = 10, y = 7, res;

res = sum(x, y);

// вызов функции в выражениях

res = sum(x, y) + sum(5, 9) + sum(x+y, 100);

if (sum(x,y) > 0)

printf(“Сумма положительная”);

if ((res = sum(x,y)) < 0)

printf(“Сумма отрицательная = %d”, res);

printf(“%d”, sum(x, y)); // печатаем возврат

sum(x,y); // игнорируем возврат

}

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

На первый взгляд возможность игнорировать возвращаемое значение может показаться странной и даже бессмысленной. Но в программах на С очень часто встречаются такие функции, возвращаемое значение которых содержит некоторую «не всегда нужную» программисту информацию. И очень хороший пример такой функции – printf(). Мы с вами этой функцией пользовались, и вы, даже не подозревали, что эта функция к тому же возвращает какой-то результат. А она возвращает значение типа int. Если число, которое она вернула, отрицательное – функции «что-то не понравилось». Если 0 или больше, то это длина напечатанной ей строки в символах. Такое отбрасывание возвращаемого значения встречается очень часто.