Instruction return (C)

Une instruction return arrête l’exécution d’une fonction et retourne le contrôle à la fonction appelante. L'exécution reprend dans la fonction d'appel au point immédiatement après l'appel. Une instruction return peut également retourner une valeur à la fonction appelante. Pour plus d’informations, consultez Type de retour.

Syntaxe

jump-statement:
return expressionopt ;

La valeur expression, si celle-ci est présente, est retournée à la fonction appelante. En cas d’omission de expression, la valeur de retour de la fonction est indéfinie. L’expression, si elle est présente, est évaluée, puis convertie dans le type retourné par la fonction. Quand une instruction return contient une expression dans des fonctions qui ont un type de retour void, le compilateur génère un avertissement et l’expression n’est pas évaluée.

Si aucune instruction return n’apparaît dans une définition de fonction, le contrôle retourne automatiquement à la fonction appelante après l’exécution de la dernière instruction de la fonction appelée. Dans ce cas, la valeur de retour de la fonction appelée est indéfinie. Si la fonction a un type de retour autre que void, il s’agit d’un bogue sérieux et le compilateur imprime un message de diagnostic d’avertissement. Si la fonction a un type de retour void, ce comportement est correct, mais son style peut être considéré comme médiocre. Utilisez une instruction return simple pour clarifier votre intention.

En guise de bonne pratique d’ingénierie, spécifiez toujours un type de retour pour vos fonctions. Si aucune valeur de retour n’est requise, déclarez la fonction pour avoir un type de retour void. Si aucun type de retour n’est spécifié, le compilateur C suppose un type de retour par défaut int.

De nombreux programmeurs utilisent des parenthèses pour entourer l’argument expression de l’instruction return. Toutefois, C n’exige pas les parenthèses.

Le compilateur peut émettre un message de diagnostic d’avertissement concernant le code inaccessible s’il trouve des instructions placées après l’instruction return.

Dans une fonction main, l’instruction return et l’expression sont facultatives. Ce qui arrive à la valeur retournée, si elle est spécifiée, dépend de l’implémentation. Spécifique à Microsoft : l’implémentation de Microsoft C retourne la valeur d’expression au processus qui a appelé le programme, par exemple, cmd.exe. Si aucune expression return n’est fournie, le runtime Microsoft C retourne une valeur indiquant la réussite (0) ou l’échec (valeur non nulle).

Exemple

Cet exemple est un programme en plusieurs parties. Il montre l’instruction return et la façon dont elle est utilisée tant pour arrêter l’exécution de la fonction que pour éventuellement une valeur.

// 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 fonction square retourne le carré de son argument, dans un type plus large pour empêcher une erreur arithmétique. Spécifique à Microsoft : dans l’implémentation Microsoft C, le type long long est suffisamment grand pour contenir le produit de deux valeurs int sans dépassement de capacité.

Les parenthèses autour de l’expression return dans square sont évaluées comme faisant partie de l’expression et ne sont pas exigées par l’instruction 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 fonction ratio retourne le rapport de ses deux arguments int en tant que valeur double à virgule flottante. L’expression return est forcée d’utiliser une opération à virgule flottante en castant l’un des opérandes à double. Dans le cas contraire, l’opérateur de division entière serait utilisé et la partie fractionnaire serait perdue.

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 fonction report_square appelle square avec une valeur de paramètre INT_MAX, la plus grande valeur entière signée tenant dans un int. Le résultat long long est stocké dans squared, puis imprimé. La fonction report_square a un type de retour void. Elle n’a donc pas d’expression dans son instruction 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.
}

La fonction report_ratio appelle ratio avec des valeurs de paramètre 1 et INT_MAX. Le résultat double est stocké dans fraction, puis imprimé. La fonction report_ratio ayant un type de retour void, elle n’a pas besoin de retourner explicitement une valeur. L’exécution de report_ratio « décroche » sans retourner aucune valeur à l’appelant.

int main()
{
    int n = 1;
    int x = INT_MAX;

    report_square();
    report_ratio( n, x );

    return 0;
}

La fonction main appelle deux fonctions : report_square et report_ratio. Comme report_square ne prend aucun paramètre et retourne void, nous n’affectons pas son résultat à une variable. De même, comme report_ratio retourne void, nous n’enregistrons pas non plus sa valeur de retour. Après chacun de ces appels de fonction, l’exécution se poursuit à l’instruction suivante. Ensuite, main retourne une valeur de 0 (généralement utilisée pour signaler la réussite) pour arrêter le programme.

Pour compiler l’exemple, créez un fichier de code source nommé C_return_statement.c. Ensuite, copiez l’exemple de code entier, dans l’ordre indiqué. Enregistrez le fichier et compilez-le dans une fenêtre d’invite de commandes développeur à l’aide de la commande :

cl /W4 C_return_statement.c

Ensuite, pour exécuter l’exemple de code, entrez C_return_statement.exe à l’invite de commandes. La sortie de l’exemple ressemble à ceci :

value = 2147483647, squared = 4611686014132420609
1 / 2147483647 = 0.0000000004656613

Voir aussi

Instructions