Salut Maxence,
Le cas mentionné par KX est celui d'une fonction autre que la fonction principale
main
, c'est à dire une fonction appelée par
main
directement ou indirectement, où le programmeur qui conçoit une telle fonction décide de son prototype et si elle renvoie ou non quelque chose en fonction de l'usage qu'il veut en faire.
Si la fonction ne renvoie rien, elle est de type
void
comme le dit KX, et le
return
pour terminer la fonction avant l'accolade fermante est facultatif. Il peut être utilisé par contre pour terminer la fonction prématurément avant la fin et revenir à la fonction appelante. S'il est utilisé dans une fonction void, bien sûr on l'utilisera sous la forme simple
return;
. Dans ce cas
return;
ne retourne rien et signifiera seulement : retourner (revenir) à la fonction appelante.
Le cas de la fonction
main
est particulier et la norme définissant le langage C impose d'utiliser l'un des prototypes suivants :
int main(void);
ou
int main(int argc, char **argv);
Si tu veux faire un programme portable, ton programme devrait comporter pour la fonction
main
une ou plusieurs instructions
return
avec un entier.
Dans ce cas, l'instruction
return
signifie terminer le programme en rendant le contrôle à l'environnement hôte d'exécution du programme et l'entier sert à lui communiquer le statut de l'exécution du programme qu'il a lancé.
- s'il est suivi de zéro ou de
EXIT_SUCCESS
, le programme se termine en indiquant à l'environnement hôte d'exécution qu'il a "réussi",
- et si la valeur retournée est
EXIT_FAILURE
, le programme se termine en indiquant à l'environnement hôte d'exécution qu'il n'a "pas réussi".
Ainsi, un programme C minimal portable conforme à la norme du C89 qui ne fait rien d'autre que s'exécuter et se terminer serait :
int main(void) {
return 0;
}
Ce que l'environnement hôte d'exécution fait du code de statut dépend de son implémentation et n'est pas défini par le langage C.
Un programmeur peut décider d'utiliser les codes de statut pour renseigner les programmes qui l'appellent sur le résultat de son exécution, éventuellement avec des codes additionnels. Il documente alors en général son programme, et indiquer dans la documentation de celui-ci la signification des différents codes de statut qu'il a décidé d'utiliser en plus de
EXIT_SUCCESS
ou
EXIT_FAILURE
.
Par exemple, sous GNU Linux, la commande
grep
, qui sert à rechercher la présence d'une chaîne de caractères dans une ligne d'un ou plusieurs fichiers, retourne 0 si les lignes recherchées ont été trouvées, 1 si aucune ligne n'a été trouvée, et 2 si une erreur s'est produite à l'exécution.
https://linux.die.net/man/1/grep
Note que dans la révision C99 de la norme, tu peux te contenter de
int main(void) {
}
car cette révision de la norme prévoit, dans le cas de
main
, un retour implicite avec une valeur de 0 lorsque l'exécution atteint l'accolade fermante du
main
.
Dal