Книга: Язык Си - руководство для начинающих

ВОЗВРАЩЕНИЕ ЗНАЧЕНИЯ ФУНКЦИЕЙ: ОПЕРАТОР return

ВОЗВРАЩЕНИЕ ЗНАЧЕНИЯ ФУНКЦИЕЙ: ОПЕРАТОР return

     Создадим функцию, вычисляющую абсолютную величину числа. Абсолютная величина числа - это его значение (если отбросить знак). Следовательно, абсолютная величина 5 равна 5, а абсолютная величина -3 равна 3. Мы назовем эту функцию abs( ). Входом для abs() может быть любое число, для которого мы хотим найти абсолютную величину. Выходом функции будет соответствующее неотрицательное число. Входная величина может обрабатываться благодаря наличию аргумента; выходная величина возвращается (т. е. выдается), как вы увидите ниже, при помощи ключевого слова языка Си - return. Поскольку функция abs( ) должна быть вызвана другой функцией, мы создадим простую программу main( ), основной целью которой будет проверка, работает ли функция abs( ). Программа, спроектированная для того, чтобы проверять работу функции именно таким образом, называется "драйвером". Драйвер подвергает функцию последовательным проверкам. Если результаты оказываются удовлетворительными, то ее можно поместить в программу, заслуживающую большего внимания. (Термин "драйвер" обычно относится к программам, управляющим работой устройств.) Приведем далее наш драйвер и функцию, вычисляющую абсолютную величину числа:

/* abs.драйвер */

main( )

{

int а = 10, b = 0, с = -22;

int d, e, f; 

d = abs(a);

с= abs(b);

f = abs(c);

printf(" °%d %d %dn" , d, e, f);

}

/* функция, вычисляющая величину числа */

abs(x) int x;

{

int y;

у = (x < 0) ? -x : x; /* вспомните операцию  ?: */

return (у ); /* возвращает значение у вызывающей программе */

}

Результат работы программы выглядит так:

10 0 22

     Сначала вспомним операцию условия ?:. Эта операция в функции abs( ) выполняется следующим образом: если x меньше 0, у полагается равным -x; в противном случае у полагается равным x. Это как раз то, что нам нужно, поскольку если x равен -5, то у равен -(-5), т. e. 5.

     Ключевое слово return указывает на то, что значение выражения, заключенного в круглые скобки, будет присвоено функции, содержащей это ключевое слово. Поэтому, когда функция abs( ) впервые вызывается нашим драйвером, значением abs(a) будет число 10, которое затем присваивается переменной d.

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

d = abs(a);

по-другому можно выразить так:

abs(a);

d = у;

     Можно ли в действительности воспользоваться такой записью? Нет, так как вызывающая программа даже не подозревает о том, что переменная у существует.

     Возвращаемое значение можно присвоить переменной, как в нашем примере, или использовать как часть некоторого выражения, например, следующим образом:

answer = 2*abs(z) + 25;

printf("  %dn" , abs(-32 + answer));

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

/* функция, вычисляющая абсолютную величину числа,

вторая версия */

abs(x) int x;

{

 if(x < 0)

        return(-x);

else

        relurn(x);

}

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

/* функция, вычисляющая абсолютную величину числа,

третья версия */

abs(x) int(x);

{

 if (x < 0)

        return(-x);

else

        return(x);

printf(" Профессор Флеппард - болван. n");

}

     Наличие оператора return препятствует тому, чтобы оператор печати printf( ) когда-нибудь выполнился в программе. Профессор Флеппард может пользоваться в своих программах объектным кодом, полученным в результате компиляции данной функции, и никогда не узнает об истинных чувствах своего студента-программиста.

     Вы можете также использовать просто оператор return;

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

Оглавление книги


Генерация: 1.737. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз