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
expression
opt;
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