return
Instrução (C)
A instrução return
encerra a execução de uma função e retorna o controle para a função de chamada. A execução é retomada na função de chamada no ponto imediatamente após a chamada. Uma instrução return
pode retornar um valor à função de chamada. Para obter mais informações, consulte Tipo de retorno.
Sintaxe
jump-statement
:
return
expression
opt;
O valor de expression
, se existir, será retornado à função de chamada. Se o valor de expression
for omitido, o valor retornado da função será indefinido. A expressão, se presente, será avaliada e convertida no tipo retornado pela função. Quando uma instrução return
contém uma expressão em funções que têm um tipo de retorno void
, o compilador gera um aviso e a expressão não é avaliada.
Se nenhuma instrução return
aparecer em uma definição de função, o controle retornará automaticamente à função de chamada depois que a última instrução da função chamada for executada. Nesse caso, o valor de retorno da função chamada será indefinido. Se a função tiver um tipo de retorno diferente de void
, será um bug grave e o compilador imprimirá uma mensagem de diagnóstico de aviso. Se a função tem um tipo de retorno void
, esse comportamento é aceitável, mas pode ser considerado um estilo ruim. Use uma instrução return
simples para deixar sua intenção clara.
Como uma boa prática de engenharia, sempre especifique um tipo de retorno para suas funções. Se um valor de retorno não for necessário, declare a função para ter o tipo de retorno void
. Se um tipo de retorno não é especificado, o compilador C pressupõe um tipo de retorno padrão de int
.
Muitos programadores colocam o argumento expression
da instrução return
entre parênteses. No entanto, C não requer parênteses.
O compilador poderá emitir uma mensagem de diagnóstico de aviso sobre código inacessível se encontrar quaisquer instruções colocadas após a instrução return
.
Em uma função main
, a instrução return
e a expressão são opcionais. O que acontece com o valor retornado, se um for especificado, depende da implementação. Específico da Microsoft: a implementação do Microsoft C retorna o valor da expressão para o processo que invocou o programa, como cmd.exe
. Se nenhuma expressão return
for fornecida, o runtime do Microsoft C retornará um valor que indica êxito (0) ou falha (um valor diferente de zero).
Exemplo
Este exemplo é um programa em várias partes. Ele demonstra a instrução return
e como ela é usada para encerrar a execução da função e, opcionalmente, para retornar um 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 );
}
A função square
retorna o quadrado de seu argumento, em um tipo mais amplo para evitar um erro aritmético. Específico da Microsoft: na implementação do Microsoft C, o tipo long long
é grande o suficiente para manter o produto de dois valores int
sem estouro.
Os parênteses ao redor da expressão return
em square
são avaliados como parte da expressão, e não são exigidos pela instrução 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;
}
A função ratio
retorna a proporção de seus dois argumentos int
como um valor de ponto flutuante double
. A expressão return
é forçada a usar uma operação de ponto flutuante convertendo um dos operandos para double
. Caso contrário, o operador de divisão inteiro seria usado e a parte fracionária seria perdida.
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.
}
A função report_square
chama square
com um valor de parâmetro de INT_MAX
, o maior valor inteiro com sinal que se encaixa em um int
. O resultado long long
é armazenado em squared
, em seguida, é impresso. A função report_square
tem um tipo de retorno void
, portanto, não tem uma expressão em sua instrução 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.
}
A função report_ratio
chama ratio
com valores de parâmetro de 1
e INT_MAX
. O resultado double
é armazenado em fraction
, em seguida, é impresso. A função report_ratio
tem um tipo de retorno void
, portanto, não precisa retornar explicitamente um valor. A execução de report_ratio
"cai da parte inferior" e não retorna nenhum valor para o chamador.
int main()
{
int n = 1;
int x = INT_MAX;
report_square();
report_ratio( n, x );
return 0;
}
A função main
chama duas funções: report_square
e report_ratio
. Como report_square
não usa parâmetros e retorna void
, não atribuímos seu resultado a uma variável. Da mesma maneira, report_ratio
retorna void
, portanto, também não salvamos seu valor retornado. Após essas chamadas de função, a execução continua na próxima instrução. Em seguida, main
retorna um valor de 0
(normalmente usado em relatório de êxito) para encerrar o programa.
Para compilar o exemplo, crie um arquivo de código-fonte chamado C_return_statement.c
. Em seguida, copie todo o código de exemplo, na ordem mostrada. Salve o arquivo e compile-o em uma janela de prompt de comando do Desenvolvedor usando o comando:
cl /W4 C_return_statement.c
Em seguida, para executar o código de exemplo, digite C_return_statement.exe
no prompt de comando. O resultado do exemplo é semelhante a este:
value = 2147483647, squared = 4611686014132420609
1 / 2147483647 = 0.0000000004656613