Оператор RETURN¶
Оператор RETURN — это инструкция в языках программирования, предназначенная для завершения выполнения текущей подпрограммы (функции, процедуры, метода) и возврата управления вызвавшему её коду. В большинстве языков оператор return также позволяет передать обратно некоторое значение — результат работы функции. Оператор return является фундаментальной конструкцией структурного и процедурного программирования, обеспечивая механизм вычисления и передачи данных между частями программы.
¶Синтаксис и семантика
Синтаксис оператора return варьируется в зависимости от языка программирования, но общая структура включает ключевое слово return и, опционально, возвращаемое выражение.
¶Основные формы
return;— завершает выполнение функции без возврата значения. Используется в процедурах (void-функциях) или для досрочного выхода.return выражение;— вычисляет значение выражения, завершает функцию и передаёт это значение вызывающему коду. Тип возвращаемого значения должен соответствовать объявленному типу функции.
¶Семантика выполнения
При выполнении оператора return происходят следующие действия:
- Вычисляется возвращаемое выражение (если оно присутствует).
- Выполнение текущей функции немедленно прекращается. Любой код, расположенный после
return, не выполняется. - Управление передаётся в точку вызова функции.
- Возвращаемое значение (если есть) подставляется в место вызова функции.
- Локальные переменные функции, как правило, уничтожаются (освобождается память на стеке), если они не были перемещены или скопированы.
¶История
Концепция возврата значения из подпрограммы существовала ещё в ранних языках программирования, таких как FORTRAN (1957). В нём для возврата значения использовалось присваивание имени функции: FUNCTION F(X); F = X*X; RETURN. Ключевое слово RETURN служило для завершения подпрограммы.
В языке ALGOL (1960) оператор return появился в более привычном виде, но с использованием return для явного указания значения. В языке C (1972) оператор return был стандартизирован как return выражение; и return;, что стало основой для синтаксиса многих последующих языков (C++, Java, C#, JavaScript, PHP и др.).
¶Возвращаемые значения
¶Типы возвращаемых значений
- Примитивные типы: целые числа, числа с плавающей точкой, символы, булевы значения.
- Ссылочные типы: объекты, массивы, строки. В этом случае возвращается ссылка на объект, а не его копия.
- Составные типы: структуры, кортежи, записи. В некоторых языках (например, Go, Python) можно вернуть несколько значений:
return a, b. - void (пустой тип): функция не возвращает никакого значения. Оператор
returnиспользуется без выражения или опускается.
¶Особенности в разных языках
- C/C++:
returnможет возвращать только одно значение. Для возврата нескольких значений используются указатели, ссылки или структуры. В C++11 появилась семантика перемещения, позволяющая эффективно возвращать большие объекты. - Java:
returnвсегда возвращает одно значение. Для возврата нескольких значений используются массивы или коллекции. - Python:
returnможет возвращать кортеж, что позволяет эмулировать возврат нескольких значений:return a, b(фактически возвращается кортеж(a, b)). - JavaScript:
returnможет возвращать любое значение. Еслиreturnне указан, функция возвращаетundefined. - Go: функция может объявлять несколько возвращаемых значений:
func div(a, b int) (int, error) { return a / b, nil }. - Rust: последнее выражение в функции (без точки с запятой) автоматически становится возвращаемым значением. Оператор
returnиспользуется для досрочного выхода.
¶Применение
¶Завершение функции
Оператор return используется для досрочного выхода из функции в зависимости от условий. Это позволяет избежать глубокой вложенности условных конструкций.
``c int find(int* arr, int size, int target) { for (int i = 0; i < size; i++) { if (arr[i] == target) { return i; // Досрочный выход при нахождении } } return -1; // Возврат -1, если элемент не найден } ``
¶Возврат результата вычислений
Основное назначение return — передача результата работы функции вызывающему коду.
``python def factorial(n): if n <= 1: return 1 return n * factorial(n - 1) ``
¶Возврат из рекурсивных функций
В рекурсивных функциях оператор return критически важен: он не только возвращает значение на текущем уровне, но и передаёт результат на предыдущий уровень рекурсии, пока не будет достигнут исходный вызов.
¶Ограничения и критика
¶Только одно значение
В языках, не поддерживающих множественные возвращаемые значения (C, Java, C#), return может вернуть только один объект. Это вынуждает программистов использовать выходные параметры, структуры или выбрасывать исключения, что может усложнять код.
¶Побочные эффекты
Оператор return немедленно завершает функцию. Если перед return не были выполнены необходимые действия (например, освобождение ресурсов, закрытие файлов), это может привести к утечкам памяти или другим проблемам. В современных языках эту проблему решают с помощью RAII (C++), finally (Java, C#), defer (Go) или контекстных менеджеров (Python).
¶Злоупотребление ранними возвратами
Чрезмерное использование return в середине функции может сделать код трудночитаемым, особенно если функция длинная. В таких случаях предпочтительнее структурировать код с помощью условных операторов или выделить логику в отдельные функции.
¶Альтернативы
- Исключения: В некоторых языках (C++, Java, Python) для возврата информации об ошибке используются исключения, а не возвращаемые значения.
- Выходные параметры: В C# и C++ можно использовать ключевые слова
outиrefдля передачи значений обратно через параметры. - Продолжения (continuations): В функциональных языках (Scheme, Haskell) управление может передаваться через механизм продолжений, который является более обобщённой концепцией, чем
return. - Сопрограммы и генераторы: В Python и JavaScript ключевое слово
yieldпозволяет приостанавливать выполнение функции и возвращать значение, не завершая её полностью.
¶Интересные факты
- В языке C оператор
returnв функцииmain()возвращает код завершения программы операционной системе. Значение0обычно означает успешное завершение, ненулевое — ошибку. - В языке Fortran 77 оператор
RETURNмог иметь необязательный аргумент — целое число, указывающее, на какой оператор после вызова нужно перейти (альтернативный возврат). Эта возможность считается устаревшей и не поддерживается в современных версиях Fortran. - В некоторых языках (например, в ранних версиях BASIC) оператор
RETURNиспользовался исключительно для выхода из подпрограммы, вызванной с помощьюGOSUB, и не возвращал значения.
¶Источники
- Керниган Б., Ритчи Д. «Язык программирования C». 2-е издание. — М.: Вильямс, 2009.
- Страуструп Б. «Язык программирования C++. Специальное издание». — М.: Бином, 2011.
- Эккель Б. «Философия Java». 4-е издание. — СПб.: Питер, 2015.
- Лутц М. «Изучаем Python». 5-е издание. — М.: Вильямс, 2019.
- Документация языка Go: «Effective Go» (golang.org/doc/effective_go).
- ISO/IEC 9899:2011 — Стандарт языка C.
- ISO/IEC 14882:2020 — Стандарт языка C++.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

