Return в C++

Все программы имеют жизненный цикл. Когда приложение завершает работу, оно должно сообщить об этом системе. Для передачи соответствующей информации используются специальные операторы – операторы возврата.
Далее предстоит разобраться с принципами работы функции return в C++. Эта информация пригодится преимущественно начинающим разработчикам.
Описание функции возврата
Все пользовательские функции после завершения выполнения инструкций способны возвращать значения туда, откуда они были вызваны. Пример – int main. Она в конце работы всегда возвращает значение в операционную систему. Связано это с тем, что ОС изначально вызывала main для работы программного обеспечения.
В C++ и C имеются операторы возврата. Они называются функциями перехода. Используются для возврата значений или остановки выполнения операции. Называется оператор перехода return (ретурном).
При обработке return происходит следующее:
- Выполнение имеющейся функции прекращается.
- Управление переходит обратно в точку вызова обработанной операции.
- Инструкции, написанные после return, никогда не выполняются.
- Если внутри функции отсутствует соответствующий оператор, при достижении закрывающейся фигурной скобки управление передается в точку вызова обработанной операции. Возвращаемое значение не определяется.
Операторы return имеются несколько сценариев использования. Всего их два. Далее они будут рассмотрены более подробно.
Использование внутри основной функции
Это – первый метод применения returning. Он делает следующее:
- Return останавливает исполнение программы. Происходит присваивание значения 0 (zero) или 1 (one). Они указываются на статус выполнения.
- Соответствующие коды использовались в C в виде соглашения. Связано это с отсутствием поддержки объектов, классов и исключений непосредственно в языке.
- Return 0 возвращает функции 0. Данная запись указывает на успешное выполнение заданных операций. Функция обработана так, как было задумано изначально.
- Return 1 возвращает 1. Указывает на наличие ошибки или сбоя при выполнении приложения. Данная запись свидетельствует о том, что функция не работает по задуманному предназначению.
Что делает returned 0, понятно. Стоит обратить внимание на то, что операционные системы могут самостоятельно завершать приложения с определенными кодами статуса выхода. Это возможно тогда, когда выполняется некоторый спектр недопустимых операций. А еще в зависимости от операционной системы на устройстве пользователя могут меняться соглашения о кодах возврата. Это достаточно редкая ситуация.
Внутри пользовательских функций
Второй вариант использования returns в программном коде – это внутри пользовательских функций. В C++ данный подход широко используется на практике. Соответствующий язык программирования рассматривает логическое значение в качестве отдельного типа данных с двумя «исходами» — истина (true) и ложь (false).
Значения 0 и 1 являются целочисленными (тип int). Они не могут быть неявно преобразованы в логические. Это приводит к тому, что:
- return 0 делает возврат false из заданной инструкции;
- return 1 возвращает истину.
Необходимо помнить, что не всегда returns применяются с 0 и 1. Далее предстоит рассмотреть наглядный пример с отличающимся возвращаемым параметром.
Принцип работы – пример
Чтобы лучше разбираться в операторах перехода в C++, рекомендуется рассмотреть принцип их работы на наглядном примере. Необходимо написать приложение, которое будет запрашивать у клиента число, а затем выводить его квадрат. Для уточнения «цифры» используется отдельная инструкция. Ее предстоит создать самостоятельно.
Делается это так:
- Сначала требуется создать функцию, которая запрашивает число на вывод с консоли:.
- Во второй строке создается функция типа int под названием EnterNumer.
- Строки 3-6 используются для описания инструкций, выполняемых после вызова функции. Сначала клиенту на экране предлагается ввод целого числа. Далее программа создает переменную для него и получит заданный параметр.
- Описанная функция вызывается из главной (main): .
- Функция, запрашивающая и получающая число, вызвана. По завершению работы она должна вернуть в main число, которое было указано пользователем. Эта операция прописана в 7 строке кода. После его обработки произойдет возврат переменной int. Поэтому инструкция выглядит как return input: .
- Чтобы сохранить значения, необходимо воспользоваться переменной. Она инициализируется функцией EnterNumber(). Это происходит в строке 11: .
- Соответствующая инструкция указывает на то, что в памяти резервируется место для переменной с именем num типа int. Далее происходит инициализация ее значением, возвращенным из функции EnterNumber. Предварительно запускается выполнение предусматриваемых инструкций.
- Необходимо завершить приложение выводом на дисплей квадрата числа, полученного из функции EnterNumber(). Для этого используется std::cout:.
При обработке соответствующего кода на экране появится такой результат:
Мы сделали программу, которая использует return. Он используется для возврата значений. Но соответствующий оператор может ничего не возвращать.
Тип void
Тип функции void в C++ — это ничего или пустота. Он указывает компилятору на то, что соответствующая команда не возвращает никаких параметров. Если в ее конце устанавливается оператор return, программа просто не пройдет стадию компиляции.
Данная операция вызывается так же, как и команды, возвращающие параметры. Она просто выполняет все необходимые инструкции, написанные в теле, после чего завершается. Вот наглядный пример:
Написанное приложение печатает две строчки текста, хранимых в двух «алгоритмах» типа void. Они ничего не вернут – только выполняют заданные инструкции. После этого происходит после обращения к ним main().
Как быстрее разобраться с темой
Операторы перехода в C++ – это не так трудно, как кажется. Чтобы надписи типа return, include, main и другие не вызывали вопросов, рекомендуется пройти дистанционные компьютерные курсы. На них с нуля пользователей научат разрабатывать приложения на разных языках – от Python до C++.
Пример – от образовательного центра OTUS. Пользователя в срок до 12 месяцев научат основам разработки. Люди смогут освоить любую IT-профессию. В процессе обучения гарантируется постоянное кураторство, много практики, а также интересные домашние задания. Ученику помогут составить портфолио. В конце курса выдается электронный сертификат, который подтверждает приобретенный спектр навыков и знаний.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus ! Ниже – один из них:
Оператор return (C)
Оператор return завершает выполнение функции и возвращает управление вызывающей функции. Выполнение возобновляется в вызывающей функции в точке сразу после вызова. Оператор return может возвращать значение, передавая его вызывающей функции. Дополнительные сведения см. в статье Тип возвращаемого значения.
Синтаксис
jump-statement :
return expression необ. ;
Значение expression , если оно имеется, возвращается вызывающей функции. Если expression параметр опущен, возвращаемое значение функции не определено. Параметр «выражение», если он присутствует, вычисляется и преобразуется к типу, возвращаемому функцией. Если оператор return содержит выражение в функциях, имеющих тип возвращаемого значения void , то компилятор выдает предупреждение, а выражение не вычисляется.
Если в определении функции оператор return не указан, то после выполнения последнего оператора вызванной функции управление автоматически возвращается вызывающей функции. В этом случае возвращаемое значение вызванной функции не определено. Если функция имеет тип возвращаемого значения, отличный от void , это считается серьезной ошибкой и компилятор выводит предупреждающее диагностическое сообщение. Если функция имеет тип возвращаемого значения void , то такое поведение приемлемо, но может считаться плохим стилем. Чтобы ваше намерение было понятным, используйте простой оператор return .
В качестве лучшей методики разработки рекомендуется всегда указывать тип возвращаемого значения для ваших функций. Если возвращаемое значение не требуется, объявите функцию как имеющую тип возвращаемого значения void . Если тип возвращаемого значения не указан, компилятор C предполагает, что по умолчанию используется тип возвращаемого значения int .
Многие программисты используют круглые скобки для заключения expression аргумента return оператора . Однако использовать эти скобки в языке C необязательно.
Если компилятор обнаруживает операторы, размещенные после return , он может вывести предупреждающее диагностическое сообщение о недоступном для выполнения коде.
В функции main оператор return и выражение являются необязательными. То, что происходит с указанным возвращаемым значением, зависит от реализации. Только для Майкрософт:реализация C от Майкрософт возвращает значение выражения процессу, вызвавшему программу, например cmd.exe . Если выражение return не указано, среда выполнения C от Майкрософт возвращает значение, соответствующее успешному (0) или неудачному (ненулевое значение) выполнению.
Пример
В этом примере показана одна программа из нескольких частей. Она демонстрирует оператор return и использование его для завершения выполнения функции и, при необходимости, возврата какого-то значения.
// C_return_statement.c // Compile using: cl /W4 C_return_statement.c #include // for INT_MAX #include // for printf long long square( int value ) < // Cast one operand to long long to force the // expression to be evaluated as type long long. // Note that parentheses around the return expression // are allowed, but not required here. return ( value * (long long) value ); >
Функция square возвращает квадрат своего аргумента, используя более широкий тип для избежания арифметической ошибки. Только для систем Майкрософт: в реализации C от Майкрософт тип long long достаточно велик, чтобы вмещать произведение двух значений int без переполнения.
Скобки вокруг выражения return в функции square вычисляются как часть выражения, и использовать их в операторе return не требуется.
double ratio( int numerator, int denominator ) < // Cast one operand to double to force floating-point // division. Otherwise, integer division is used, // then the result is converted to the return type. return numerator / (double) denominator; >
Функция ratio возвращает частное двух int аргументов в виде значения double с плавающей запятой. Выражение return принудительно использует операцию с плавающей запятой путем приведения одного из операндов к типу double . В противном случае будет использоваться оператор целочисленного деления, а дробная часть будет потеряна.
void report_square( void ) < int value = INT_MAX; long long squared = 0LL; squared = square( value ); printf( "value = %d, squared = %lld\n", value, squared ); return; // Use an empty expression to return void. >
Функция report_square вызывает square со значением параметра INT_MAX — самым большим целым числом со знаком, которое помещается в int . Результат типа long long сохраняется в squared , а затем выдается в выводе. Функция report_square имеет тип возвращаемого значения void , поэтому она не содержит выражения в операторе return .
void report_ratio( int top, int bottom ) < double fraction = ratio( top, bottom ); printf( "%d / %d = %.16f\n", top, bottom, fraction ); // It's okay to have no return statement for functions // that have void return types. >
Функция report_ratio вызывает ratio со значениями параметров 1 и INT_MAX . Результат типа double сохраняется в fraction , а затем выдается в выводе. Функция report_ratio имеет тип возвращаемого значения void , поэтому явно возвращать значение не требуется. Выполнение report_ratio не дает результата и не возвращает вызывающей функции никакого значения.
int main()
Функция main вызывает две функции: report_square и report_ratio . Поскольку report_square не принимает параметров и возвращает void , результат не присваивается переменной. Аналогичным образом функция report_ratio возвращает void , поэтому ее возвращаемое значение тоже не сохраняется. После вызова каждой из этих функций выполнение продолжается в следующем операторе. Затем main возвращает значение 0 (обычно свидетельствующее об успешном выполнении), чтобы завершить программу.
Чтобы скомпилировать пример, создайте файл исходного кода с именем C_return_statement.c . Затем скопируйте весь пример кода в показанном здесь порядке. Сохраните файл и скомпилируйте его в окне Командной строки разработчика с помощью следующей команды:
cl /W4 C_return_statement.c
После этого, чтобы запустить пример кода, введите C_return_statement.exe в командной строке. Выходные данных в этом примере выглядят следующим образом:
value = 2147483647, squared = 4611686014132420609 1 / 2147483647 = 0.0000000004656613
Что делает return 1 в конце функции и почему он важен?
Есть код — обычное возведение в степень, но через рекурсию. Не совсем понимаю, зачем нужен return 1 в конце функции. Я так понимаю функции просто что-то надо вывести если условие не выполнено? Но почему она просто не закончится? И почему используется не банальный return 0?
def power(a, n): if n != 0: return a * power(a, n-1) return 1 print(power(float(input()), float(input())))
Отслеживать
26.2k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков
задан 3 авг 2019 в 18:57
Antivist Home Antivist Home
85 1 1 золотой знак 4 4 серебряных знака 11 11 бронзовых знаков
Думаете, power(1, 0) должен выводить именно 0?
3 авг 2019 в 19:14
Разберитесь, пожалуйста, в логике кода, а потом уже задавайте вопрос про функции. Если Вы считаете, что a**0 == 0 , то с вопросами кода можно пока что обождать.
3 авг 2019 в 19:59
Тут проблема не в а**0 а в том чтоб закончить рекурсию когда доберемся до хвоста. Без ретурн 1 ответ будет также правильный, если убрать и иф. Но рекурсия не остановится.
Зачем return в программе?
What up, программач.
Т.е, указано, что return — это самый подходящий способ остановить программу.
Вот если указано return 0; — то программа закончиться.Я правильно понимаю?
А если ничего не указать?Она будет в памяти висеть или что?
А если указать 1?
Т.е. если указываешь 0, то это типа false.Можно значит false писать, кому что удобно?
Все никак не могу с этим ретурном разобраться.
- Вопрос задан более трёх лет назад
- 33877 просмотров
Комментировать
Решения вопроса 1
Вот если указано return 0; — то программа закончиться.Я правильно понимаю?
Только если это return в main().
return это команда закончить текущую функцию (и вернуть значение вызыающей функции)
А если ничего не указать?Она будет в памяти висеть или что?
С 1998 года она выполнит return 0 (опять же, справедливо только для main() ) как только достигнет конца функции main().
Т.е. если указываешь 0, то это типа false.
Это EXIT_SUCCESS.
А если указать 1?
Implementation defined. Обычно работает так же как и EXIT_FAILURE.
Фактически это код выхода. Он возвращается в ОС. Если программа была запущена из командной строки этот код выхода можно проверить чтобы узнать как была завершена программа.
Ответ написан более трёх лет назад
Нравится 7 1 комментарий

Antony @RiseOfDeath
Уточнение — код выхода возвращаетс программе, запустившей прогрумму. (хотя как правило он ею не используется)
Ответы на вопрос 1
main() — это входящая функция. И все же это именно функция, со всеми вытекающими свойствами.
Ее можно обьявить как void, а значит она не должна что либо возвращать и return писать не надо.
Все же многие не понимают по началу, что return, это не только остановка программы, но еще и вывод результата работы функций.
Пример:
//создаем свою собственную функцию, которая что-то делает и что-то возвращает. int myrandom() < int a; a = rand()%100; //генерация случайного числа return a; // возвращаем результат генерации >//а вот наша программка, в которой мы вызовем эту функцию. void main() < int s = myrandom(); // функция myrandom возвращает результат в переменную s. cout
Ответ написан более трёх лет назад
Нравится 1 3 комментария
Saboteur @saboteur_kiev Куратор тега C++
Если объявить как void, это означает что можно возвращать любой тип данных, включая ничего. Но main должен возвращать код завершения программы, чтобы соответствовать.
Сергей: судя по вопросу, у человека не правильное мнение об return. Тут нужно пояснить сам факт, что return именно возвращает результат работы функции.
А выше люди прицепились к этому main, загоняют ему про "EXIT_SUCCESS", про "Implementation defined", а ему тупо надо пояснить, что функция должна обязана что либо возвращать. А возвращается это именно с помощью return.
Для меня когда-то было большим откровением, что, в некоторой степени, для операционной системы приложение является просто подпрограммой.