Оператор 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 <limits.h> // for INT_MAX
#include <stdio.h> // 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
возвращает квадрат своего аргумента, используя более широкий тип для избежания арифметической ошибки. Корпорация Майкрософт: в реализации Microsoft 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()
{
int n = 1;
int x = INT_MAX;
report_square();
report_ratio( n, x );
return 0;
}
Функция 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