logo search
Подбельский Фомин_Программирование на языке СИ_

Обращение к функции и ее прототип.

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

имя_функцш (список_фактических_параметров)

Значение этого выражения - возвращаемое функцией значение (определяется в теле функции выполненным оператором return). Список фактических параметров (аргументов) – это список выражений, заменяющих формальные параметры функции. Соответствие между формальными и фактическими параметрами устанавливается по порядку их расположения в списках. Если формальных параметров у функции нет, то не должно быть и фактических параметров при обращении к этой функции. Фактические параметры (аргументы) передаются из вызывающей программы в функцию по значению, т.е. вычисляется значение каждого аргумента, и именно оно используется в теле функции вместо заменяемого формального параметра. Примеры вызовов определенных выше функций для вычисления объема цилиндра:

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

тип_результата имя_функции( );

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

float volume( );...

... z=volume(z-1.0,le-2);

Переменная z получит вещественное значение (объем цилиндра), вычисленное с помощью функции volume(). Если описание float volume(); опустить, то в вызывающей программе функция volume() воспринимается как целочисленная, т.е. результат будет неверен.

Стандарт языка Си предусматривает обязательное описание функции со стандартным заголовком с помощью прототипа. Прототип в отличие от старомодного описания включает спецификацию параметров:

тип_результата имя_функции (спецификация_формалъных_параметров);

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

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

float w(float, float);

Scalar_Product (int n, float a[ ], float b[ ]);

Имена формальных параметров в прототипе функции w( ) обычно не указаны.

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

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

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