Instrucción return
(C)
Una instrucción return
termina la ejecución de una función y devuelve el control a la función de llamada. La ejecución se reanuda en la función de llamada, en el punto que sigue inmediatamente a la llamada. Una instrucción return
puede devolver un valor a la función de llamada. Para obtener más información, consulte Tipo de valor devuelto.
Sintaxis
jump-statement
:
return
optexpression
;
El valor de expression
, si existe, se devuelve a la función que llama. Si expression
se omite, el valor devuelto de la función es indefinido. El valor de expression, si está presente, se evalúa y después se convierte al tipo devuelto por la función. Cuando una instrucción return
contiene una expresión en funciones que tiene un tipo de valor devuelto void
, el compilador genera una advertencia y la expresión no se evalúa.
Si no aparece ninguna instrucción return
en una definición de función, el control vuelve automáticamente a la función de llamada después de que se ejecute la última instrucción de la función llamada. En este caso, el valor devuelto de la función llamada es indefinido. Si la función tiene un tipo de valor devuelto distinto de void
, se trata de un error grave, y el compilador imprime un mensaje de diagnóstico de advertencia. Si la función tiene un tipo de valor devuelto void
, este comportamiento es correcto, pero puede que se considere de un estilo insuficiente. Use una instrucción return
sin formato para que su intención sea clara.
En ingeniería, se recomienda siempre especificar un tipo de valor devuelto para las funciones. Si no se necesita ningún valor devuelto, declare la función para que tenga el tipo de valor devuelto void
. Si no se especifica ningún tipo de valor devuelto, el compilador de C supone un tipo de valor devuelto predeterminado de int
.
Muchos programadores usan paréntesis para incluir el argumento expression
de la instrucción return
. Sin embargo, C no necesita los paréntesis.
El compilador puede emitir un mensaje de diagnóstico de advertencia sobre código inaccesible si encuentra instrucciones situadas después de la instrucción return
.
En una función main
, la instrucción return
y la expresión son opcionales. Lo que sucede con el valor devuelto, si se especifica uno, depende de la implementación. Específico de Microsoft: la implementación de Microsoft C devuelve el valor de la expresión al proceso que ha invocado el programa, como cmd.exe
. Si no se proporciona ninguna expresión return
, el tiempo de ejecución de Microsoft C devuelve un valor que indica "correcto" (0) o "incorrecto" (un valor distinto de cero).
Ejemplo
Este ejemplo es un programa en varias partes. Muestra la instrucción return
y cómo se usa para terminar la ejecución de la función y, opcionalmente, para devolver un valor.
// 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 );
}
La función square
devuelve el cuadrado de su argumento, en un tipo más amplio para evitar un error aritmético. Específico de Microsoft: En la implementación de Microsoft C, el tipo long long
es lo suficientemente grande como para contener el producto de dos valores de int
sin desbordamiento.
Los paréntesis que rodean la expresión return
en square
se evalúan como parte de la expresión y no son necesarios para la instrucción 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;
}
La función ratio
devuelve la relación de sus dos argumentos int
como un valor de double
de punto flotante. La expresión return
se ve forzada a usar una operación de punto flotante mediante la conversión de uno de los operandos a double
. De lo contrario, se utilizaría el operador de división de enteros y se perdería la parte fraccionaria.
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.
}
La función report_square
llama a square
con un valor de parámetro de INT_MAX
, el valor entero con signo más grande que cabe en int
. El resultado de long long
se almacena en squared
y se imprime. La función report_square
tiene un tipo de valor devuelto void
, por lo que no tiene ninguna expresión en su instrucción 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.
}
La función report_ratio
llama a ratio
con valores de parámetro de 1
y INT_MAX
. El resultado de double
se almacena en fraction
y se imprime. La función report_ratio
tiene un tipo de valor devuelto void
, por lo que no es necesario devolver explícitamente un valor. La ejecución de report_ratio
"cae fuera de la parte inferior" y no devuelve ningún valor al autor de la llamada.
int main()
{
int n = 1;
int x = INT_MAX;
report_square();
report_ratio( n, x );
return 0;
}
La función main
llama a dos funciones: report_square
y report_ratio
. Como report_square
no toma ningún parámetro y devuelve void
, no se asigna el resultado a una variable. Del mismo modo, report_ratio
devuelve void
, por lo que tampoco se guarda el valor devuelto. Después de cada una de estas llamadas a funciones, la ejecución continúa en la instrucción siguiente. A continuación, main
devuelve un valor de 0
(que se suele usar para informar de un proceso correcto) para terminar el programa.
Para compilar el ejemplo, cree un archivo de código fuente denominado C_return_statement.c
. A continuación, copie todo el código de ejemplo en el orden que se muestra. Guarde el archivo y compílelo en una ventana del símbolo del sistema para desarrolladores mediante el comando:
cl /W4 C_return_statement.c
A continuación, para ejecutar el código de ejemplo, escriba C_return_statement.exe
en el símbolo del sistema. El resultado del ejemplo es similar a lo siguiente:
value = 2147483647, squared = 4611686014132420609
1 / 2147483647 = 0.0000000004656613