return Statement (C)
A return statement ends the execution of a function, and returns control to the calling function. Execution resumes in the calling function at the point immediately following the call. A return statement can return a value to the calling function. For more information, see Return type.
Syntax
jump-statement :
return expression opt ;
The value of expression , if present, is returned to the calling function. If expression is omitted, the return value of the function is undefined. The expression, if present, is evaluated and then converted to the type returned by the function. When a return statement contains an expression in functions that have a void return type, the compiler generates a warning, and the expression isn’t evaluated.
If no return statement appears in a function definition, control automatically returns to the calling function after the last statement of the called function is executed. In this case, the return value of the called function is undefined. If the function has a return type other than void , it’s a serious bug, and the compiler prints a warning diagnostic message. If the function has a void return type, this behavior is okay, but may be considered poor style. Use a plain return statement to make your intent clear.
As a good engineering practice, always specify a return type for your functions. If a return value isn’t required, declare the function to have void return type. If a return type isn’t specified, the C compiler assumes a default return type of int .
Many programmers use parentheses to enclose the expression argument of the return statement. However, C doesn’t require the parentheses.
The compiler may issue a warning diagnostic message about unreachable code if it finds any statements placed after the return statement.
In a main function, the return statement and expression are optional. What happens to the returned value, if one is specified, depends on the implementation. Microsoft-specific: The Microsoft C implementation returns the expression value to the process that invoked the program, such as cmd.exe . If no return expression is supplied, the Microsoft C runtime returns a value that indicates success (0) or failure (a non-zero value).
Example
This example is one program in several parts. It demonstrates the return statement, and how it’s used both to end function execution, and optionally, to return a value.
// 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 ); >
The square function returns the square of its argument, in a wider type to prevent an arithmetic error. Microsoft-specific: In the Microsoft C implementation, the long long type is large enough to hold the product of two int values without overflow.
The parentheses around the return expression in square are evaluated as part of the expression, and aren’t required by the return statement.
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; >
The ratio function returns the ratio of its two int arguments as a floating-point double value. The return expression is forced to use a floating-point operation by casting one of the operands to double . Otherwise, the integer division operator would be used, and the fractional part would be lost.
The report_square function calls square with a parameter value of INT_MAX , the largest signed integer value that fits in an int . The long long result is stored in squared , then printed. The report_square function has a void return type, so it doesn’t have an expression in its return statement.
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. >
The report_ratio function calls ratio with parameter values of 1 and INT_MAX . The double result is stored in fraction , then printed. The report_ratio function has a void return type, so it doesn’t need to explicitly return a value. Execution of report_ratio «falls off the bottom» and returns no value to the caller.
The main function calls two functions: report_square and report_ratio . As report_square takes no parameters and returns void , we don’t assign its result to a variable. Likewise, report_ratio returns void , so we don’t save its return value, either. After each of these function calls, execution continues at the next statement. Then main returns a value of 0 (typically used to report success) to end the program.
To compile the example, create a source code file named C_return_statement.c . Then, copy all the example code, in the order shown. Save the file, and compile it in a Developer command prompt window by using the command:
cl /W4 C_return_statement.c
Then, to run the example code, enter C_return_statement.exe at the command prompt. The output of the example looks like this:
value = 2147483647, squared = 4611686014132420609 1 / 2147483647 = 0.0000000004656613
return Statement (C++)
Terminates the execution of a function and returns control to the calling function (or to the operating system if you transfer control from the main function). Execution resumes in the calling function at the point immediately following the call.
Syntax
Remarks
The expression clause, if present, is converted to the type specified in the function declaration, as if an initialization were being performed. Conversion from the type of the expression to the return type of the function can create temporary objects. For more information about how and when temporaries are created, see Temporary Objects.
The value of the expression clause is returned to the calling function. If the expression is omitted, the return value of the function is undefined. Constructors and destructors, and functions of type void ,cannot specify an expression in the return statement. Functions of all other types must specify an expression in the return statement.
When the flow of control exits the block enclosing the function definition, the result is the same as it would be if a return statement without an expression had been executed. This is invalid for functions that are declared as returning a value.
A function can have any number of return statements.
The following example uses an expression with a return statement to obtain the largest of two integers.
Example
// return_statement2.cpp #include int max ( int a, int b ) < return ( a >b ? a : b ); > int main()
Завершение программы C++
В C++ вы можете выйти из программы следующими способами:
Функция exit
Функция, объявленная exit в , завершает программу C++. Значение, указанное в качестве аргумента , exit возвращается операционной системе в виде кода возврата программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Вы можете использовать константы EXIT_FAILURE и EXIT_SUCCESS , также определенные в , чтобы указать на успех или сбой программы.
Функция abort
Функция abort , также объявленная в стандартном файле , завершает программу C++. Разница между exit и abort заключается в том, что exit позволяет выполнять обработку завершения среды выполнения C++ (вызов глобальных деструкторов объектов). abort немедленно завершает программу. Функция abort обходит обычный процесс уничтожения инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit .
Для корпорации Майкрософт. Для обеспечения совместимости Windows реализация abort microsoft может разрешить выполнение кода завершения БИБЛИОТЕКи DLL в определенных обстоятельствах. Для получения дополнительной информации см. abort .
Функция atexit
Используйте функцию , atexit чтобы указать действия, выполняемые до завершения программы. Глобальные статические объекты, инициализированные до вызова , atexit не уничтожаются перед выполнением функции обработки выхода.
return оператор в main
Оператор return позволяет указать возвращаемое значение из main . Оператор return в main первом действует так же, как и любое другое return утверждение. Все автоматические переменные уничтожаются. main Затем вызывает exit с возвращаемым значением в качестве параметра. Рассмотрим следующий пример.
// return_statement.cpp #include struct S < int value; >; int main() < S s< 3 >; exit( 3 ); // or return 3; >
Операторы exit и return в предыдущем примере имеют аналогичное поведение. Оба завершают программу и возвращают операционной системе значение 3. Разница заключается в том, что exit не уничтожает автоматическую переменную s , в то время как return оператор делает.
Как правило, C++ требует, чтобы функции, имеющие типы возвращаемых значений, отличные от void возвращаемых значений. Функция main является исключением; она может заканчиваться без return оператора . В этом случае он возвращает конкретное значение реализации в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit напрямую (или при вызове после return оператора из main ) объекты потока, связанные с текущим потоком, уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных atexit в , если таковые имеются). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 и sd2 создаются и инициализируются перед записью в main . После завершения работы этой программы с помощью инструкции return сначала sd2 удаляется, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp #include class ShowData < public: // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w" ); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on the output device. void Disp( char *szData ) < fputs( szData, OutputDev ); >private: FILE *OutputDev; >; // Define a static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define another static object of type ShowData. The output // is directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Другой способ написания этого кода — объявить ShowData объекты с блоком область, который неявно уничтожает их при выходе из область: