Quelle est la différence entre les instructions return et exit en programmation C
- instruction return vs exit() dans main() (5 réponses )
Réponses
Trop de publicités?- le retour est un enseignement de la langue qui renvoie à partir d'un appel de fonction.
- la sortie est un appel système (pas un énoncé en langage) qui met fin au processus en cours.
Le seul cas où les deux font la même chose est dans l' main()
de la fonction, comme un retour de principal effectue une exit()
.
Exemple avec return
:
#include <stdio.h>
void f(){
printf("Executing f\n");
return;
}
int main(){
f();
printf("Back from f\n");
}
Si vous exécutez ce programme, il imprime:
Executing f Back from f
Un autre exemple d' exit()
:
#include <stdio.h>
#include <stdlib.h>
void f(){
printf("Executing f\n");
exit(0);
}
int main(){
f();
printf("Back from f\n");
}
Si vous exécutez ce programme, il imprime:
Executing f
Vous ne recevez jamais de "Retour de f". Notez également l' #include <stdlib.h>
nécessaire pour appeler une fonction de la bibliothèque exit()
.
Notez également que le paramètre de la exit()
est un entier (c'est le retour d'état de la procédure que le lanceur de processus peut obtenir; l'usage conventionnel est 0 en cas de réussite ou de toute autre valeur pour une erreur).
Le paramètre de l'instruction return est quel que soit le type de retour de la fonction. Si la fonction de type void, vous pouvez omettre le retour à la fin de la fonction.
Dernier point, exit()
sont disponibles en deux saveurs _exit()
et exit()
. La différence entre les formes est qu' exit()
des appels de fonctions enregistrés à l'aide d' atexit()
ou on_exit()
avant de terminer le processus tout en _exit()
(à partir de #include <unistd.h>
, ou son synonyme _Exit de #include <stdlib.h>
) termine le processus immédiatement.
J'ai écrit deux programmes:
int main(){return 0;}
et
#include <stdlib.h>
int main(){exit(0)}
Après l'exécution d' gcc -S -O1
. Voici ce que j'ai trouvé en regardant
à l'assemblée (seulement important de pièces):
main:
movl $0, %eax /* setting return value */
ret /* return from main */
et
main:
subq $8, %rsp /* reserving some space */
movl $0, %edi /* setting return value */
call exit /* calling exit function */
/* magic and machine specific wizardry after this call */
Donc, ma conclusion est la suivante: utiliser return
quand vous le pouvez, et exit()
quand vous en avez besoin.
En C, il n'y a pas beaucoup de différence quand utilisé dans la fonction de démarrage du programme (qui peuvent être main()
, wmain()
, _tmain()
ou le nom par défaut utilisé par le compilateur).
Si vous return
en main()
, le contrôle revient à l' _start()
de la fonction de la bibliothèque C qui, à l'origine du démarrage de votre programme, puis appelle exit()
, de toute façon. Donc, il n'a vraiment pas d'importance que celle que vous utilisez.