Возврат результата в программировании. "Вычислимость" выражения, вызова -- что это. Что значит что функция возвращает значение

В коде программы все что вы видите можно разделить на:

  1. действия (или имена действий , например, вызовы процедур, функций, или обращение к операторам)
  2. данные для этих действий (например, литералы) или имена, за которыми скрываются данные (например, переменные)

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

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

Использование/игнорирование возвращаемого значения

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

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

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

  • a = f1(9);

    -- тут присваивание, теперь в переменной а лежит число 14.

  • a = 5 + f1(2);
    

    -- тут часть выражения, а потом присваивание:
    сначала вызов f1(2) возвращает 7 в выражение 5 + 7 а потом уже происходит запись результата данного выражения в переменную a.

  • f2(f1(2));
    

    -- результат f1() используется, как входные данные для какой-то другой функции f2().

  • Все три примера выше это полезное (в смысле получения возвращаемого значения) использование, а теперь глянем на пример с игнорированием:

  • a = 3;
    f1(a);
    

    -- пример игнорирования возвращаемого результата, так как то, что возвращается никуда не записывается и не передается, значение переменной a по-прежнему =3, хотя вызов f1(a) и вернул число 8, но это число не было использовано в выражении или для записи в переменную.

Выражения и их значения (как "возвращаемые")

В случае с операторами (с их помощью и строятся выражения, в частности арифметические) понятно, что, например, знак "+" возвращает результат, суммы, т.е. что во многих ЯП в переменную "a" будет возвращена сумма, например (синтаксис Паскаля):

a := 5 + 2;

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

Что значит "функция возвращает значение"? Возврат значений подпрограммой

То, что функция "возвращает значение", фактически означает, что результат её вызова может быть использован:

  • для присваивания переменной
  • или как часть других выражений.

-- и то, и другое возможно как раз потому, что вызов функции "возвращает значение".

Например, пусть у нас есть функция f1(). Во многих языках программирования допустимы операции вроде присваивания результата работы функции (т.е. её возвращаемого значения) переменной, например:

a = f1();

или как часть выражения, например:

a = 5 + f1();

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

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

Пример бесполезной функции (синтаксис PHP)

Например:

function Sum($num1, $num2) {
 $total = $numX + $numY;
}

-- тут результат попадает в локальную переменную total, но эта переменная остаётся в изолированной области памяти (никак не используется, в этой функции вообще нет return), а потому наружу, в случае попытки использовать результат работы этой функции будет возвращён null:

$a =  Sum(5,  2); // == null

Чтобы использовать такую функцию (сделать её "полезной"), полученную сумму нужно вернуть явно:

function Sum($num1, $num2) {
 $total = $numX + $numY;
  return $total;
}

(без явной инструкции система не поймёт, что именно возвращать, ведь функция может быть очень сложной, в ней может быть большое количество переменных). Также в данном случае можно было сразу вернуть результат выражения, без использования локальной переменной total:

function Sum($num1, $num2) {
 return $numX + $numY;
}