116 votes

Pourquoi main ne retourne pas 0 ici?

Je viens de lire

ISO/IEC 9899:201x Comité de Projet - avril 12, 2011

dans lequel j'ai trouvé sous 5.1.2.2.3 de fin de Programme

..reaching the } that terminates the main function returns a value of 0. 

cela signifie que si vous ne spécifiez pas d'instruction return, en main(), et si le programme s'exécute avec succès, puis à l'accolade fermante } de principal sera de retour 0.

Mais dans le code suivant, je ne spécifiez aucune instruction de retour, mais il ne renvoie pas 0

#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}

int main()
{
    int a=10;
    int b=5;
    int ans;    
    ans=sum(a,b);
    printf("sum is %d",ans);
}

compiler

gcc test.c  
./a.out
sum is 15
echo $?
9          // here it should be 0 but it shows 9 why?

140voto

cnicutar Points 98451

Cette règle a été ajoutée dans la version 1999 de la norme C. En C90, le statut renvoyé est indéfini.

Vous pouvez l'activer en transmettant -std=c99 à gcc.

En guise de note, il est intéressant de noter que 9 est renvoyé parce que c'est le retour de printf qui vient d'écrire 9 caractères.

15voto

Il renvoie la valeur de retour de printf c'est-à-dire le nombre de caractères réellement imprimés.

6voto

noggin182 Points 176

La valeur de retour d'une fonction est normalement stocké dans le registre eax de la cpu, de sorte que l'instruction "return 4;" habituellement de les compiler

mov eax, 4;
ret;

et de retour de x (en fonction de votre compilateur) serait quelque chose comme:

mov eax, [ebp + 4];
ret;

si vous ne spécifiez pas de valeur de retour alors le compilateur va encore cracher le "ret", mais ne modifie pas la valeur de eax. Si l'appelant ne pense que ce qui a jamais été de gauche dans le registre eax est déjà la valeur de retour. Pour cet exemple, il est habituellement la valeur de retour de printf, mais différents compilateurs générer du code machine et l'utilisation de certains registres différemment.

C'est une explication simplifiée, différentes conventions d'appel et de cibler des plates-formes jouent un rôle essentiel, mais il devrait être suffisant pour expliquer ce qui se passe "derrière les coulisses" dans votre exemple.

Si vous avez une compréhension de base de l'assembleur, il est intéressant de comparer le démontage des différents compilateurs. Vous pouvez trouver que certains compilateurs sont effacement du registre eax comme une sauvegarde.

0voto

Avec Visual Studio 2010: la valeur de retour est 0.

Comme indiqué dans certains commentaires, votre compilateur n'est pas conforme au standard que vous avez lu.

vous lisez: "SO / IEC 9899: 201x Committee Draft - 12 avril 2011 ", il faudra donc du temps pour les compilateurs ...

Je ne sais pas si cette règle existe en c99 ou non. oui, selon la réponse de cnicutar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X