Istruzione return (C)

  • 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 funzioneratiorestituisce il rapporto tra i suoi due argomentiintcome 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 funzionemainchiama due funzioni:report_squareereport_ratio. Poiché report_squarenon 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:

Related Posts

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *