- 06/10/2020
- 4 minuti a leggere
-
- c
- n
- M
- g
return
istruzione termina l’esecuzione di una funzione e restituisce il controllo alla funzione chiamante. L’esecuzione riprende nella funzione di chiamata nel punto immediatamente successivo alla chiamata. Un’istruzionereturn
può restituire un valore alla funzione chiamante. Per ulteriori informazioni, vedere Tipo di reso.
la Sintassi
salta-istruzione:
return
expressionopt;
Il valore di espressione, se presente, viene restituito alla funzione chiamante. Se l’espressione viene omessa, il valore restituito della funzione non è definito. L’espressione, se presente, viene valutata e quindi convertita nel tipo restituito dalla funzione. Quando un’istruzionereturn
contiene un’espressione in funzioni che hanno un tipo di ritornovoid
, il compilatore genera un avviso e l’espressione non viene valutata.
Se nessuna istruzionereturn
appare in una definizione di funzione, control ritorna automaticamente alla funzione chiamante dopo l’esecuzione dell’ultima istruzione della funzione chiamata. In questo caso, il valore restituito della funzione chiamata non è definito. Se la funzione ha un tipo di ritorno diverso davoid
, si tratta di un bug serio e il compilatore stampa un messaggio di diagnostica di avviso. Se la funzione ha unvoid
tipo di ritorno, questo comportamento è ok, ma può essere considerato uno stile scadente. Usa una semplice dichiarazionereturn
per chiarire il tuo intento.
Come buona pratica ingegneristica, specificare sempre un tipo di ritorno per le proprie funzioni. Se non è richiesto un valore di ritorno, dichiarare la funzione di avere void
tipo di ritorno. Se non viene specificato un tipo di ritorno, il compilatore C assume un tipo di ritorno predefinito di int
.
Molti programmatori usano parentesi per racchiudere l’argomento dell’espressione dell’istruzionereturn
. Tuttavia, C non richiede le parentesi.
Il compilatore può emettere un messaggio diagnostico di avviso sul codice irraggiungibile se trova istruzioni inserite dopo l’istruzionereturn
.
In una funzione main
, l’istruzione e l’espressione return
sono opzionali. Ciò che accade al valore restituito, se ne viene specificato uno, dipende dall’implementazione. Specifico per Microsoft: l’implementazione Microsoft C restituisce il valore dell’espressione al processo che ha richiamato il programma, ad esempiocmd.exe
. Se non viene fornita alcuna espressionereturn
, il runtime Microsoft C restituisce un valore che indica successo (0) o errore (un valore diverso da zero).
Esempio
Questo esempio è un programma in più parti. Dimostra l’istruzionereturn
e come viene utilizzata sia per terminare l’esecuzione della funzione, sia 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 printflong 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 funzionesquare
restituisce il quadrato del suo argomento, in un tipo più ampio per evitare un errore aritmetico. Specifico per Microsoft: nell’implementazione Microsoft C, il tipolong long
è abbastanza grande da contenere il prodotto di due valori int
senza overflow.
Le parentesi attorno 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 funzioneratio
restituisce il rapporto tra i suoi due argomentiint
come valore in virgola mobiledouble
. L’espressionereturn
è costretta a utilizzare un’operazione in virgola mobile lanciando uno degli operandi indouble
. In caso contrario, verrebbe utilizzato l’operatore di divisione intera 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.}
report_square
chiamate di funzione square
con un valore di parametro INT_MAX
, il più grande valore intero con segno, che si inserisce in un int
. Il risultato long long
viene memorizzato in squared
, quindi stampato. La funzionereport_square
ha un tipo di ritornovoid
, quindi non ha un’espressione nella sua istruzionereturn
.
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
chiamate di funzione ratio
con i valori di parametro di 1
e INT_MAX
. Il risultato double
viene memorizzato in fraction
, quindi stampato. La funzionereport_ratio
ha un tipo di ritornovoid
, quindi non ha bisogno di restituire esplicitamente un valore. Esecuzione di report_ratio
“cade dal fondo” 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 funzionemain
chiama due funzioni:report_square
ereport_ratio
. Poiché report_square
non accetta parametri e restituiscevoid
, non assegniamo il risultato a una variabile. Allo stesso modo, report_ratio
restituisce void
, quindi non salviamo nemmeno il suo valore di ritorno. Dopo ciascuna di queste chiamate di funzione, l’esecuzione continua all’istruzione successiva. Quindimain
restituisce un valore di0
(in genere utilizzato per segnalare il successo) per terminare il programma.
Per compilare l’esempio, creare un file di codice sorgente denominato C_return_statement.c
. Quindi, copia tutto il codice di esempio, nell’ordine mostrato. Salvare il file e compilarlo in una finestra del prompt dei comandi dello sviluppatore utilizzando 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 è simile a questo: