Condividi tramite


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:
returnexpressionOptare;

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 va bene, ma può essere considerato uno stile non corretto. Usare un'istruzione normale return per chiarire la finalità.

Come procedura di progettazione consigliata, specificare sempre un tipo restituito per le funzioni. Se non è necessario un valore restituito, dichiarare la funzione per avere 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 expression dell'istruzione return . Tuttavia, C non richiede le parentesi.

Il compilatore può generare un messaggio di diagnostica di avviso relativo al codice non raggiungibile se trova 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. Specifica 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 viene forzata 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_MAXa , 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 in basso" 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. Allo stesso modo, report_ratio restituisce void, quindi non viene salvato il valore restituito, né. Dopo ognuna di queste chiamate di funzione, l'esecuzione continua all'istruzione successiva. Restituisce quindi main un valore di 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 gli 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

Vedi anche

Istruzioni