Considérez le code "C" suivant:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
est défini à la fin du code source et aucune déclaration n'est fournie avant son utilisation dans main()
. Au moment même où le compilateur voit Func_i()
dans main()
, il sort du main()
et découvre Func_i()
. Le compilateur trouve en quelque sorte la valeur retournée par Func_i()
et la donne à printf()
. Je sais également que le compilateur ne peut pas trouver le type de retour de Func_i()
. Par défaut, il prend (devine?) Le type de retour de Func_i()
be int
. C'est-à-dire que si le code avait float Func_i()
alors le compilateur donnerait l'erreur: Types en conflit pourFunc_i()
.
De la discussion ci-dessus, nous voyons que:
Le compilateur peut trouver la valeur renvoyée par
Func_i()
.- Si le compilateur peut trouver la valeur retournée par
Func_i()
en sortant demain()
et en recherchant le code source, alors pourquoi ne peut-il pas trouver le type de Func_i (), qui est explicitement mentionné.
- Si le compilateur peut trouver la valeur retournée par
Le compilateur doit savoir qu'il
Func_i()
est de type float - c'est pourquoi il donne l'erreur de types en conflit.
- Si le compilateur sait qu'il
Func_i
est de type float, alors pourquoi suppose-t-il toujoursFunc_i()
qu'il est de type int et donne l'erreur de types en conflit? Pourquoi ne pas forcémentFunc_i()
être de type float.
J'ai le même doute avec la déclaration de variable . Considérez le code "C" suivant:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
Le compilateur donne l'erreur: 'Data_i' non déclaré (première utilisation dans cette fonction).
- Quand le compilateur voit
Func_i()
, il descend dans le code source pour trouver la valeur retournée par Func_ (). Pourquoi le compilateur ne peut-il pas faire de même pour la variable Data_i?
Éditer:
Je ne connais pas les détails du fonctionnement interne du compilateur, de l'assembleur, du processeur, etc. L'idée de base de ma question est que si je dis (écris) la valeur de retour de la fonction dans le code source enfin, après l'utilisation de cette fonction, le langage "C" permet à l'ordinateur de trouver cette valeur sans donner d'erreur. Maintenant, pourquoi l'ordinateur ne trouve-t-il pas le type de la même manière. Pourquoi le type de Data_i ne peut-il pas être trouvé car la valeur de retour de Func_i () a été trouvée. Même si j'utilise leextern data-type identifier;
instruction, je ne dis pas la valeur à renvoyer par cet identifiant (fonction / variable). Si l'ordinateur peut trouver cette valeur, pourquoi ne peut-il pas trouver le type. Pourquoi avons-nous besoin de la déclaration à terme?
Je vous remercie.
Func_i
non valide. Il n'y a jamais eu de règle pour déclarer implicitement des variables non définies, de sorte que le deuxième fragment était toujours mal formé. (Oui, les compilateurs acceptent toujours le premier échantillon car il était valide, s'il était bâclé, sous C89 / C90.)