
Рис. 9.3. Формал ьные параметры и фактические аргумен ты
334 глава 9
НА ЗАМЕТКУ! Фактические аргументы и формальные параметры
Фактический аргумент — это выражение, указанное в круглых скобках при вызове функции. Формальный параметр — это переменная, объявленная в заголовке определения функции. Когда функция вызывается, переменные, объявленные как формальные параметры, создаются и инициализируются значениями, которые получены в результате вычисления фактических аргументов. В листинге 9.2 выражения ' *' и width являются фактическими аргументами, когда функция show_n_char() вызывалась первый раз, a space и 11 — фактическими аргументами при втором ее вызове. В определении функции переменные ch и num представляют собой формальные параметры.
Представление в виде черного ящика
При представлении функции show n char() в виде черного ящика входными данными являются отображаемый символ и количество пробелов, которые нужно пропустить. Результирующим действием будет вывод символа указанное число раз. Входные данные передаются функции посредством аргументов. Этой информации вполне достаточно для понимания того, как эта функция используется в main(). Кроме того, эта информация служит проектной спецификацией для написания функции.
Тот факт, что ch, num и count — локальные переменные, закрытые в рамках функции show_n_char(), является существенным аспектом подхода с черным ящиком. Если бы в функции main() применялись переменные с такими же именами, то это были бы другие, независимые переменные. То есть, если бы в main() имелась переменная count, то изменение ее значения не привело бы к изменению значения count в show n char(), и наоборот. Все, что происходит внутри черного ящика, скрыто от вызывающей функции.
Возврат значения из функции с помощью return
Вы уже видели, как передавать информацию из вызываемой функции в вызванную. Для отправки информации в противоположном направлении используется возвращаемое значение. Чтобы напомнить, как это работает, мы реализуем функцию, которая возвращает меньшее значение из двух аргументов. Назовем эту функцию imin(), т.к. она предназначена для поддержки значений типа int. Кроме того, мы создадим простую функцию main(), единственной целью которой будет проверка работоспособности imin(). Программу, разработанную для такого тестирования функций, иногда называют драйвером. Драйвер получает функцию для проверки. Если функция проходит проверку успешно, ее можно применять в более примечательной программе. В листинге 9.3 показан код драйвера и функции выбора минимального значения.
Листинг 9.3. Программа lesser.с

Функции 335

Вспомните, что функция scanf() возвращает количество успешно прочитанных элементов, поэтому ввод чего-либо, отличного от двух целых чисел, приведет к прекращению выполнения цикла. Ниже приведены результаты запуска этой программы:
Введите два целых числа (или q для завершения) :
509 333
Меньшим из двух чисел 509 и 333 является 333.
Введите два целых числа (или q для завершения) :
-9393 б
Меньшим из двух чисел -9393 и 6 является -9393.
Введите два целых числа (или q для завершения):
q
Программа завершена.
Ключевое слово return приводит к тому, что следующее за ним выражение становится возвращаемым значением функции. В данном случае функция возвращает значение, которое было присвоено переменной min. Поскольку min имеет тип int, функция imin() также относится к этому типу.
Переменная min является закрытой для imin() , но с помощью return значение min передается обратно вызывающей функции. Действием показанного ниже оператора будет присваивание значения min переменной lesser:
lesser = imin(n,m);
Можно ли было бы взамен написать следующий код?
imin(n, m); lesser = min;
Нет, потому что вызывающая функция даже не подозревает о существовании переменной min. Вспомните, что переменные внутри функции imin() являются локальными по отношению к ней. Вызов функции imin (evill,evil2) копирует значения из одного набора переменных в другой.
Возвращаемое значение не только может быть присвоено переменной, но также использоваться как часть выражения. Например, можно написать следующий код:
answer = 2 * iminfz, zstar) + 25;
Читать дальше