основыкнигиwin/dos*nixготовоелирикагостиФОРУМПОИСК
Б.В. Керниган, Д.М. Ричи -- Язык C

1.7. Функции

      В языке "C" функции эквивалентны подпрограммам или функциям в фортране или процедурам в PL/1, паскале и т.д. Функции дают удобный способ заключения некоторой части вычислений в черный ящик, который в дальнейшем можно использовать, не интересуясь его внутренним содержанием. Использование функций является фактически единственным способом справиться с потенциальной сложностью больших программ. Если функции организованы должным образом, то можно игнорировать то, как делается работа; достаточно знание того, что делается. Язык "C" разработан таким образом, чтобы сделать использование функций легким, удобным и эффективным. Вам будут часто встречаться функции длиной всего в несколько строчек, вызываемые только один раз, и они используются только потому, что это проясняет некоторую часть программы.
      До сих пор мы использовали только предоставленные нам функции типа PRINTF, GETCHAR и PUTCHAR; теперь пора написать несколько наших собственных. так как в "C" нет операции возведения в степень, подобной операции ** в фортране или PL/1, давайте проиллюстрируем механику определения функции на примере функции POWER(M,N), возводящей целое м в целую положительную степень N. Так значение POWER(2,5) равно 32. Конечно, эта функция не выполняет всей работы операции **, поскольку она действует только с положительными степенями небольших чисел, но лучше не создавать дополнительных затруднений, смешивая несколько различных вопросов.
      Ниже приводится функция POWER и использующая ее основная программа, так что вы можете видеть целиком всю структуру.

  MAIN()  /* TEST POWER FUNCTION */
  {
     INT I;
 
     FOR(I = 0; I < 10; ++I)
      PRINTF("%D %D %D\N",I,POWER(2,I),POWER(-3,I));
  }
 
  POWER(X,N)  /* RAISE  X  N-TH POWER; N > 0  */
  INT X,N;
  {
     INT I, P;
     P = 1;
     FOR (I =1; I <= N; ++I)
     P = P * X;
     RETURN (P);
  }

      Все функции имеют одинаковый вид:

  имя (список аргументов, если они имеются)
  описание аргументов, если они имеются
  {
  описания
     операторы
  }

      Эти функции могут быть записаны в любом порядке и находиться в одном или двух исходных файлах. Конечно, если исходная программа размещается в двух файлах, вам придется дать больше указаний при компиляции и загрузке, чем если бы она находилась в одном, но это дело операционной системы, а не атрибут языка. В данный момент, для того чтобы все полученные сведения о прогоне "C"-программ, не изменились в дальнейшем, мы будем предполагать, что обе функции находятся в одном и том же файле.
      Функция POWER вызывается дважды в строке

 PRINTF("%D %D %D\N",I,POWER(2,I),POWER(-3,I));

при каждом обращении функция POWER, получив два аргумента, вазвращает целое значение, которое печатается в заданном формате. В выражениях POWER(2,I) является точно таким же целым, как 2 и I. /Не все функции выдают целое значение; мы займемся этим вопросом в главе 4.
      Аргументы функции POWER должны быть описаны соответствующим образом, так как их типы известны. Это сделано в строке

 INT X,N;

которая следует за именем функции.
      Описания аргументов помещаются между списком аргументов и открывающейся левой фигурной скобкой; каждое описание заканчивается точкой с запятой. Имена, использованные для аргументов функции POWER, являются чисто локальными и недоступны никаким другим функциям: другие процедуры могут использовать те же самые имена без возникновения конфликта. Это верно и для переменных I и P; I в функции POWER никак не связано с I в функции MAIN.
      Значение, вычисленное функцией POWER, передаются в MAIN с помощью оператора RETURN, точно такого же, как в PL/1. Внутри круглых скобок можно написать любое выражение. Функция не обязана возвращать какое-либо значение; оператор RETURN, не содержащий никакого выражения, приводит к такой же передаче управления, как "сваливание на конец" функции при достижении конечной правой фигурной скобки, но при этом в вызывающую функцию не возвращается никакого полезного значения.
      Упражнение 1-13.
      ----------------
      Напишите программу преобразования прописных букв из файла ввода в строчные, используя при этом функцию OWER(C), которая возвращает значение 'C', если 'C' -- не буква, и значение соответствующей строчной буквы, если 'C' -- буква.

ПРЕДЫДУЩАЯ ЧАСТЬ
1.6. Массивы
СОДЕРЖАНИЕ СЛЕДУЮЩАЯ ЧАСТЬ
1.8. Аргументы -- вызов по значению