déclarations de prototype de fonction

Je pratique la fonction en c et rencontre le programme ….

#include int main() { float a=15.5; char ch ='C'; printit(a,ch); return 0; } printit(a,ch) { printf("%f\n%c",a,ch); } 

Je veux savoir que pourquoi le programme ci-dessus comstack et ne donne pas l’erreur telle que je l’ai comprise jusqu’à présent …

  1. La fonction en c doit être déclarée avec le prototype spécifique (mais ce programme ne contient pas le prototype)

  2. pourquoi le programme donne le résultat ‘x’ pour la variable char?

  3. la fonction dans c peut-elle accepter la valeur sans être déclarée à propos de parameters de type comme ce qui a été fait dans la déclaration de fonction?

    Premièrement, le langage C n’exige pas de fournir un prototype pour une fonction avant de l’appeler. Dans la version C99 du langage, il est nécessaire de déclarer une fonction avant de l’appeler, mais il n’est toujours pas nécessaire de fournir un prototype.

    Puisque votre compilateur ne s’est pas plaint, vous devez utiliser un compilateur C89 / 90, pas un compilateur C99.

    Deuxièmement, dans C89 / 90, lorsque vous appelez une fonction non déclarée en passant des arguments de type float et char comme vous le faites dans

     printit(a,ch); 

    le compilateur effectuera des promotions d’argument par défaut et transmettra les valeurs de type double et int . Votre fonction doit être définie en conséquence pour que le code fonctionne. Vous avez défini votre fonction comme

     printit(a, ch) { ... 

    Cette définition signifie que les deux parameters ont le type int . Cela viole l’exigence ci-dessus. Le comportement de votre code n’est pas défini. Cela n’a plus aucun sens d’parsingr plus avant le code ou de deviner pourquoi il imprime quelque chose de la manière dont il l’a imprimé. Le comportement de votre code est, encore une fois, indéfini.

    La définition correcte de votre fonction (non déclarée) pourrait se présenter comme suit

     int printit(double a, int ch) { ... 

    Alternativement, il peut être défini dans le style K & R comme

     printit(a, ch) float a; { ... 

    Cela ferait probablement fonctionner votre code correctement. Cependant, la meilleure approche serait de fournir un prototype à printit avant de l’appeler. Le prototype que vous souhaitez utiliser – void printit(double a, int ch) ou void printit(float a, char ch) ou autre – est à vous de décider.

    1. En C, si vous ne définissez pas une fonction avant de l’utiliser, le compilateur en déduit une définition implicite
    2. Si vous ne spécifiez pas un type pour un argument de fonction ou sa valeur de retour, int par défaut
    3. Vous obtenez le «x» parce que le compilateur utilise l’argument ch comme un entier.
    1. Lorsque vous appelez printit () à partir de main, main doit en savoir plus sur printit. Une façon de résoudre ce problème consiste à définir printit above.
    2. Le printf devrait imprimer “15.5”, puis une nouvelle ligne, puis “C.”
    3. Je suis confus sur la question. La déclaration pour printit () doit être null printit (float a, char ch);
     void printit(float a, char ch) { printf("%f\n%c",a,ch); } int main() { float a=15.5; char ch ='C'; printit(a,ch); return 0; }
    void printit(float a, char ch) { printf("%f\n%c",a,ch); } int main() { float a=15.5; char ch ='C'; printit(a,ch); return 0; } 

    Ce code devrait presque certainement se lire:

     #include  void printit(float a, char ch); int main() { float a=15.5; char ch ='C'; printit(a,ch); return 0; } void printit(float a, char ch) { printf("%f\n%c\n",a,ch); } 

    Si vous voulez l’écrire proprement. Cependant, pour répondre à ce qui précède:

    1) Vous devriez inclure un prototype, oui. Cependant, comme vous ne comstackz qu’une seule unité (fichier .c), le compilateur peut assez facilement savoir où se trouve votre fonction et donc ce que vous vouliez dire. J’ai compris:

     test.c:11: warning: conflicting types for 'printit' test.c:7: note: previous implicit declaration of 'printit' was here 

    Je recommande fortement de comstackr en utilisant -Wall -Werror -pedantic pour convertir des avertissements comme celui-ci en erreurs et abandonner la compilation, ce qui vous oblige à écrire du code correct et à réduire ainsi les bogues ultérieurement.

    2) Je reçois 15.5 puis un C sur une nouvelle ligne. Je ne sais pas d’où vient le Z.

    3) Vous n’êtes pas obligé de spécifier des types – cependant, si vous ne le faites pas, vous ne bénéficierez pas du compilateur vous avertissant si les types sont incompatibles. Un cas très courant en est le transfert de données à l’assemblage. Ce n’est pas ssortingctement nécessaire, mais c’est probablement une violation de la norme C et n’est certainement pas la meilleure pratique.

    Problème 1: Le printit est défini après le main . La solution consiste à placer un prototype de fonction sur le dessus. Problème 2: Déclarez correctement le prototype de fonction (vous n’avez pas écrit les types de retour et d’argument) Solution:

     #include  void printit(float a, char ch); int main() { float a=15.5; char ch ='C'; printit(a,ch); return 0; } void printit(float a, char ch) { printf("%f\n%c",a,ch); }