return
Istruzione (C)
Un'istruzione return
termina l'esecuzione di una funzione e restituisce il controllo alla funzione chiamante. Nella funzione chiamante, l'esecuzione riprende dal punto immediatamente successivo alla chiamata. Un'istruzione return
può restituire un valore alla funzione chiamante. Per altre informazioni, vedere Tipo restituito.
Sintassi
jump-statement
:
return
expression
optare;
Il valore di expression
, se presente, viene restituito alla funzione chiamante. Se expression
viene omesso, il valore restituito della funzione non è definito. L'espressione, se presente, viene valutata e viene quindi convertita nel tipo restituito dalla funzione. Quando un'istruzione return
contiene un'espressione nelle funzioni con un void
tipo restituito, il compilatore genera un avviso e l'espressione non viene valutata.
Se nessuna istruzione return
viene visualizzata in una definizione di funzione, il controllo ritorna automaticamente alla funzione chiamante dopo che l'ultima istruzione della funzione chiamata viene eseguita. In questo caso, il valore restituito della funzione chiamata è indefinito. Se la funzione ha un tipo restituito diverso da void
, si tratta di un bug grave e il compilatore stampa un messaggio di diagnostica di avviso. Se la funzione ha un void
tipo restituito, questo comportamento è corretto, ma può essere considerato uno stile non corretto. Usare un'istruzione semplice return
per rendere chiara la finalità.
Come procedura di progettazione consigliata, specificare sempre un tipo restituito per le funzioni. Se non è necessario un valore restituito, dichiarare la funzione in modo che abbia void
un tipo restituito. Se non viene specificato un tipo restituito, il compilatore C presuppone un tipo restituito predefinito di int
.
Molti programmatori usano parentesi per racchiudere l'argomento dell'istruzione expression
return
. Tuttavia, C non richiede le parentesi.
Il compilatore può generare un messaggio di diagnostica di avviso relativo al codice non raggiungibile se rileva eventuali istruzioni inserite dopo l'istruzione return
.
In una main
funzione, l'istruzione e l'espressione return
sono facoltative. Ciò che accade al valore restituito, se specificato, dipende dall'implementazione. Specifico di Microsoft: l'implementazione di Microsoft C restituisce il valore dell'espressione al processo che ha richiamato il programma, ad esempio cmd.exe
. Se non viene fornita alcuna return
espressione, il runtime di Microsoft C restituisce un valore che indica l'esito positivo (0) o l'errore (un valore diverso da zero).
Esempio
Questo esempio è un programma in diverse parti. Illustra l'istruzione return
e come viene usata sia per terminare l'esecuzione della funzione che, facoltativamente, per restituire un valore.
// 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 square
funzione restituisce il quadrato del relativo argomento, in un tipo più ampio per evitare un errore aritmetico. Specifico di Microsoft: nell'implementazione di Microsoft C, il long long
tipo è sufficientemente grande da contenere il prodotto di due int
valori senza overflow.
Le parentesi intorno all'espressione return
in square
vengono valutate come parte dell'espressione e non sono richieste dall'istruzione 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 ratio
funzione restituisce il rapporto dei due int
argomenti come valore a double
virgola mobile. L'espressione return
è costretta a usare un'operazione a virgola mobile eseguendo il cast di uno degli operandi in double
. In caso contrario, verrà usato l'operatore di divisione integer e la parte frazionaria andrebbe persa.
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 report_square
funzione chiama square
con un valore di parametro pari INT_MAX
a , il valore intero con segno più grande che rientra in un oggetto int
. Il long long
risultato viene archiviato in squared
, quindi stampato. La report_square
funzione ha un void
tipo restituito, quindi non ha un'espressione nella relativa return
istruzione.
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 report_ratio
funzione chiama ratio
con i valori dei parametri di 1
e INT_MAX
. Il double
risultato viene archiviato in fraction
, quindi stampato. La report_ratio
funzione ha un void
tipo restituito, quindi non è necessario restituire in modo esplicito un valore. L'esecuzione di report_ratio
"scende dalla parte inferiore" e non restituisce alcun valore al chiamante.
int main()
{
int n = 1;
int x = INT_MAX;
report_square();
report_ratio( n, x );
return 0;
}
La main
funzione chiama due funzioni: report_square
e report_ratio
. Poiché report_square
non accetta parametri e restituisce void
, il risultato non viene assegnato a una variabile. Analogamente, report_ratio
restituisce void
, quindi non si salva il valore restituito, né. Dopo ognuna di queste chiamate di funzione, l'esecuzione continua all'istruzione successiva. Restituisce quindi main
un valore ( 0
in genere usato per segnalare l'esito positivo) per terminare il programma.
Per compilare l'esempio, creare un file di codice sorgente denominato C_return_statement.c
. Copiare quindi tutto il codice di esempio nell'ordine indicato. Salvare il file e compilarlo in una finestra del prompt dei comandi per sviluppatori usando il comando :
cl /W4 C_return_statement.c
Quindi, per eseguire il codice di esempio, immettere C_return_statement.exe
al prompt dei comandi. L'output dell'esempio è analogo al seguente:
value = 2147483647, squared = 4611686014132420609
1 / 2147483647 = 0.0000000004656613