Bonjour et bienvenue à nouveau.
Dans cette conférence, je veux parler à propos de la définition des fonctions dans c.
Définir une fonction.
Nous connaissons l'importance des fonctions.
Nous comprenons les avantages.
Nous voudrons utiliser fonctions dans nos programmes.
Ainsi, lorsque vous créez une fonction pro en c, vous devez spécifier l'en-tête de
la fonction comme première ligne de la définition de la fonction.
Nous allons parler de définir une fonction, et nous allons
également parler de l'implémentation d'une fonction.
Implémentation d'une fonction est juste la résolution de problèmes, c'est
juste du code c normal.
Définir une fonction, c'est dire que la fonction existe.
Ainsi, lorsque vous définissez une fonction, le la première chose que vous
faites est d'avoir cet en-tête de fonction, puis vous suivez cela avec une accolade qui démarre le code
de bloc pour la fonction.
C'est donc comme lorsque vous utilisez un accolade dans
une instruction if, comme lorsque vous utilisez une accolade dans une boucle for, sauf que l'accolade
est requise pour les fonctions.
Il n'y a pas moyen de l'éliminer.
Et cela signifie toujours le début du code de cette fonction.
Tout ce qui se trouve entre le départ et la fin de l'accolade est le
code de la fonction.
C'est là que tu vas pour mettre en œuvre la tâche.
Donc, entre les accolades se trouve appelé le corps de la fonction et la première ligne
de la fonction est appelé l'en-tête de la fonction.
L'en-tête de fonction définit le nom de la fonction, les paramètres
de la fonction.
Nous allons parler de paramètres et arguments en détail.
Mais maintenant, tu viens juste besoin de savoir qu'il
existe quelque chose appelé paramètres.
Et le paramètre va spécifier le nombre et les types de valeurs
comment vous pouvez transmettre des données, des paramètres ont à voir avec la transmission de données.
Le type de la valeur que la fonction renvoie.
Nous avons mentionné que les fonctions nous pouvons renvoyer des données.
Donc, dans cet en-tête de fonction, vous allez
avoir le nom de la fonction, les données qui vous pouvez prendre peut être accepté par la
fonction et les données qui est retourné par la fonction.
Nous n'allons pas nous concentrer pour le moment sur les données qui peuvent être transmises
ou les données renvoyées, nous allons simplement parler de créer une fonction simple.
Le corps de la fonction contient juste du code normal, et ce code est
exécuté lorsque vous appeler ou invoquer la fonction.
Et le corps de fonction lui-même aura accès à toutes les valeurs
passées en arguments.
Ainsi, les données auxquelles vous passez it, vous pouvez utiliser ces données
dans le corps de la fonction.
À quoi ça ressemble ceci, l'en-tête de la fonction.
L'en-tête de fonction contient le premier mot.
Et l'en-tête de fonction est un mot-clé représentant le type de données
qui va être renvoyé par la fonction.
Le mot-clé suivant est le nom de la fonction.
Et puis vous avez une parenthèse gauche et puis vous avez des paramètres séparés par des
virgules, ce seront les données qui est passé à la fonction.
Et puis tu as ça parenthèses droites pour
terminer l'en-tête de la fonction.
Ensuite, vous avez l'attelle frisée cela signifie le début de
l'implémentation de la fonction.
Et vous avez un certain nombre de déclarations pour faire une tâche.
Comme je l'ai dit, tu veux faites que vos fonctions soient petites.
Ils veulent être cohérents.
Ils ne veulent pas être partout.
Ils veulent avoir un seul concentrez-vous, faites quelque chose de spécifique.
Comme je l'ai dit si tu as une fonction qui obtient l'entrée, il lit l'entrée.
Il n'imprime pas la sortie.
Il ne fait aucun tri ou ne fait rien d'autre.
Si vous avez une fonction nommée trier, il trie les données.
Il n'obtient aucune contribution.
Les fonctions doivent être cohésif et petit.
Il est beaucoup plus facile de les déboguer fonctions, alors rendez-les cohérents.
Et puis tu as ce droit accolade, qui met fin
à l'implémentation de la fonction.
C'est ce qu'une fonction ressemble à c.
Concentrons-nous maintenant sur la fonction names, et nous parlerons des paramètres et
des types de retour plus tard.
La première ligne de la fonction à nouveau définition indique au compilateur dans l'ordre de
gauche à droite trois choses à propos de la fonction, comme je l'ai mentionné.
Le type de la valeur retourne, le nom de la fonction puis
toutes les données qu'elle prend.
C'est juste pour résumer, c'est important.
En ce qui concerne les noms de fonction, vous voulez pour choisir des noms de fonction significatifs.
C'est tout aussi important que de choisir noms de variables significatifs.
Cela affecte grandement le la lisibilité du programme, alors ne
nommez pas les fonctions x ou y.
Nommez la fonction basée sur ce qu'il va faire.
Si c'est en ajoutant deux numéros, nommez-le ajouter.
Si c'est en soustrayant deux nombres, nommez-le soustraire.
Dans cet exemple, voici notre fonction simple.
Ne t'inquiète pas pour le vide, inquiétez-vous juste pour le nom ici.
Nous avons une fonction nommé message d'impression.
Et puis nous voyons cette accolade bouclée ce qui
signifie le démarrage de la fonction, puis nous avons une certaine mise en œuvre.
Et cette implémentation ne fait rien de plus
que d'afficher une chaîne, un texte.
Et puis nous avons ça accolade droite.
C'est donc une fonction très simple ne fait pas grand-chose, il affiche la sortie.
Dans cet exemple pour l'impression message, la première ligne
du message d'impression indique au compilateur que la fonction ne renvoie aucune valeur.
C'est le mot-clé void.
Encore une fois, pas besoin de se concentrer sur ça, mais c'est ce que ça fait.
Le suivant est le nom.
Et puis après le nom est arguments, ils sont appelés paramètres.
Et nous utilisons à nouveau le mot-clé void si nous ne transmettons aucune donnée.
L'instruction dans la fonction le corps peut être absent, mais les
accolades doivent toujours être présentes.
Donc, vous n'avez pas besoin d'en avoir implémentation, mais vous devez avoir les
accolades pour qu'une fonction soit présente.
S'il n'y a aucune déclaration dans le corps d'une fonction, le type
de retour doit être nul.
Et encore une fois, nous nous concentrerons sur cela plus tard et la fonction ne fera
rien car vous n'avez aucune implémentation.
Si vous définissez une fonction avec un corps vide, il peut toujours
être utile même s'il est n'accomplir rien.
Vous faites généralement cela pendant la phase de test d'un très grand programme.
Et ce que cela vous permet de faire est-ce que vous pouvez exécuter le
programme avec seulement certaines fonctions réellement faire quelque chose, vous aide à
mieux tester, vous aide à isoler les erreurs.
Vous pourriez même avoir une mise en œuvre dans le test dans le
corps de la fonction, mais commentez-le simplement.
Et puis tu peux faire ça Approche diviser pour conquérir.
Au fur et à mesure que vous testez de plus en plus de plus, vous pouvez alors commencer à
mettre l'implémentation dans les corps de fonction.
C'est une étape par étape processus de travail.
Vous travaillez constamment dans de petits morceaux, ajouter du code, tester ce code puis passer au suivant
étape, puis finalement toute la mise en œuvre sera
terminée et toutes les fonctions seront implémentées.
Il y a donc un cas d'utilisation pour ayant un corps de
fonction qui n'a pas de code ou commenté.
Fonctions de dénomination.
Le nom d'une fonction peut être n'importe quel nom légal.
Juste comme quand tu es en nommant une variable, vous
ne pouvez pas utiliser de mots réservés.
Ce sont donc des mots-clés dans le langage tel que enter double car
ils représentent des types de données.
Sizeof est un opérateur.
Tu veux pouvoir pour l'utiliser pour ou si.
Vous ne pourriez pas non plus en avoir deux fonctions avec le même nom.
Et cela est également référé à une surcharge de fonction, en quelque sorte.
Mais tu ne peux pas avoir deux fonctions avec le même nom, la surcharge n'est pas prise
en charge dans c.
Enfin, vous pouvez avoir le même nom en tant que fonction qui se trouve dans
la fonction de bibliothèque standard.
Techniquement, si vous n'incluez pas cette bibliothèque comprend un fichier d'en-tête, vous
pourrez peut-être l'avoir.
Mais si vous avez toujours voulu utiliser cette fonction de bibliothèque, le compilateur se
plaindrait et dirait que vous avez deux fonctions avec le même nom.
Alors ne nommez pas vos fonctions identique aux fonctions de bibliothèque standard.
Un nom légal est le même que une variable, une séquence de
lettres et de chiffres pour commencer.
Le premier caractère doit être une lettre et la lettre peut être un trait de soulignement.
Vous ne pouvez pas démarrer les fonctions avec des nombres ou tout type
de caractères bizarres.
Le nom que vous choisissez doit être significatif et pertinent par rapport à
ce que fait la fonction.
Je l'ai déjà dit, je le répète pour l'emphase, les noms significatifs
sont très importants.
Vous définirez souvent la fonction des noms et des noms de variables
composés de plus d'un mot.
Alors maintenant je veux parler un peu peu de style de codage.
Vous avez probablement remarqué quand j'ai écrit mon code que j'utilise cas de chameau.
Il existe trois manières différentes vous pouvez écrire les noms de
vos variables et fonctions.
Vous pouvez séparer chacun des mots dans un nom de fonction
avec un caractère souligné, c'est une approche.
Vous pouvez mettre en majuscule la première lettre de chaque mot ou
vous pouvez mettre les mots en majuscules après le premier mot, et vous avez encore joué ensemble.
Souviens-toi, tu ne peux pas avoir des espaces entre les deux.
Ceci est juste une approche pour nommer car il
est important que vous suiviez une convention afin qu'il soit plus facile à lire.
Juste avoir un long mot avec cinq mots différents.
Donc, si vous aviez une fonction qui dit vérifiez que les entrées sont valides, vous ne voudriez
pas qu'elles soient toutes en minuscules.
Ce serait vraiment difficile à lire et identifier où se trouvaient les mots.
La caisse de chameau est donc un moyen de identifier où se trouvent les mots dans
de nombreux mots et c'est facile à voir ce que fait cette fonction.
Un trait de soulignement en est un autre façon de séparer les mots.
Et mettre en majuscule la première lettre de chaque mot est une autre façon de séparer.
Il est important de pouvoir séparez les mots d'une fonction pour la
rendre plus lisible.
J'utilise habituellement un étui de chameau.
Et lorsque vous utilisez l'un de ces conventions, vous voulez l'utiliser
pour tout, vous voulez utiliser pour nommer les variables, vous voulez l'utiliser
pour vos noms de fonctions.
Habituellement, vous suivez simplement ceci convention de codage commune, cela rend
les choses plus lisibles.
Prototypes de fonction.
Nous avons parlé de définir une fonction.
Qu'en est-il de la déclaration d'une fonction.
Vous pouvez dire pourquoi avez-vous besoin de déclarer une fonction, ne la déclarez-vous
pas lorsque vous la définissez.
Mais il y a aussi un concept de déclarer une fonction.
Et c'est nécessaire si tu veux pour utiliser la fonction avant son
implémentation, avant sa définition.
Un prototype de fonction est donc un instruction qui définit une fonction.
Il dit au compilateur essentiellement tous les détails de la fonction.
Il définit son nom, son type de retour et le type de chacun de ses paramètres.
Cela ressemble donc à un en-tête de fonction.
Il fournit tous les spécifications de la fonction, principalement
vous avez probablement entendu aussi le terme signature, la signature de fonction
c'est ce que c'est.
Il spécifie les données renvoyées, les données qu'il prend et
tout ce qui concerne la fonction elle-même.
Vous souhaitez écrire un prototype de fonction de la même manière que vous écrivez l'en-tête de
la fonction, la seule différence est que vous mettez un point-virgule à la fin.
Et c'est juste déclarer la fonction.
Cela veut dire que la fonction existe.
Un prototype de fonction permet le compilateur pour générer les instructions
appropriées à chaque point où vous appelez la fonction.
Il vérifie également que vous utilisez le fonctionner correctement à chaque appel.
La raison pour laquelle vous fournissez la fonction headers vous permet d'appeler la fonction sans
avertissement ni déclaration de fonction sans qu'elle soit implémentée, donc c'est vraiment juste l'ordre de votre
code et je vous en donnerai un exemple
dans une seconde.
Lorsque vous incluez un en-tête standard dans un programme, le fichier
d'en-tête ajoute le prototype de fonction.
Les prototypes de fonction entrent généralement les fichiers d'en-tête si vous souhaitez les réutiliser dans de
nombreux fichiers sources différents.
Si vous ne les utilisez que dans un seul source, vous pouvez simplement
les mettre en haut du fichier source.
Mais parce que nous utilisons le printf fonction qui peut être utilisée
dans de nombreux fichiers sources différents, cet en-tête la fonction sera définie dans l'en-tête
ou dans cette déclaration de fonction sera défini dans l'en-tête.
Et dans ce cas, stdio. h.
Donc, ils apparaissent généralement dans fichiers source si seul ce fichier
source utilise cette fonction.
Sinon, vous les mettez dans un fichier d'en-tête s'ils
sont réutilisés par de nombreux fichiers source.
Il permet à l'une des fonctions du fichier pour appeler l'une de ces
fonctions définies quel que soit l'endroit vous avez placé l'implémentation.
Si vous placez l'implémentation d'une fonction, apres qu'on l'appelle, c va se
plaindre et dire qu'il n'en sait rien.
Parce que lorsque vous compilez, vous compilez ligne par ligne.
Si vous placez la déclaration à en haut, vous pouvez alors appeler la
fonction avant qu'elle ne soit définie, avant sa mise en œuvre.
Les noms de paramètres ne doivent pas nécessairement être même utilisé dans la définition de la fonction.
Vous pouvez avoir différents noms.
Quand je dis des noms, ce sont les identifiants des données.
Vous pouvez changer le nom du paramètres dans le prototype de fonction.
Vous devez toujours avoir les mêmes données types, mais vous pouvez modifier les noms.
C'est toujours une bonne pratique de inclure des déclarations de
fonction pour toutes les fonctions de votre programme en haut du fichier.
Il maintient votre programme plus cohérent à la conception et évite
toute erreur à tout moment si vous souhaitez appeler cette
fonction avant de l'implémenter.
Voici un exemple de certains prototypes de fonction.
Tout en haut de la fichier, nous avons nos inclus.
Et puis nous en avons fonctions que nous avons
déclarées, moyenne, additionnée et obtenue.
Vous remarquez que ça a l'air juste comme un en-tête de fonction.
Il a le type de retour, a les paramètres définis
dans la fonction, mais il a un point-virgule à la fin.
Il n'y a pas d'implémentation pour ces fonctions.
Vous dites juste au compilateur c'est la fonction qui existe et c'est
ainsi qu'elle est définie.
Ce que cela vous permet de faire est maintenant dans votre fonction principale, vous
pouvez appeler la moyenne, vous pouvez appeler la somme, vous pouvez appeler pour obtenir des données.
Et les implémentations réelles peuvent être en dessous de l'endroit où vous les appelez.
Si vous n'aviez pas la fonction en-têtes ici, lorsque vous
avez essayé de les appeler dans le principal, s'ils étaient défini sous la routine principale, vous auriez
des erreurs ou des avertissements.
Alors jetons un coup d'oeil à cela dans les blocs de code.
Ici, nous avons notre routine principale habituelle.
Maintenant disons que nous voulons pour créer une fonction ou nous voulons invoquer une
fonction.
Nous allons invoquer un fonction appelée add et elle ne
prendra aucun paramètre.
Nous l'appelons dans notre fonction principale en ligne 7.
Nous allons implémentez-le en ligne 10.
Nous allons dire nul ajouter et nous n'allons même pas faire quoi que ce soit.
Nous allons simplement le garder vide.
Quand nous allons compiler ceci, quoi vous allez remarquer que ce compilateur donne
juste un avertissement.
Il dit que l'ajout a un déclaration implicite.
Vous pouvez vous débarrasser de cet avertissement en utilisant une déclaration de fonction.
Vous pouvez déclarer la fonction en haut en disant essentiellement au compilateur que vous allez utilisez-le
quelque part, mais vous ne savez pas
où se trouve l'implémentation.
Donc ce que tu peux faire c'est que tu peux dites void ajouter ici
et ajoutez simplement le point-virgule.
Maintenant, il va s'en débarrasser avertissement et certaines compilations vous donneront en
fait une erreur.
Maintenant, quand je le compile, j'ai aucun avertissement et aucune erreur.
Alors c'est quelle fonction déclaration fait.
Cela vous permet de mettre la fonction n'importe où.
Maintenant si vous n'aviez pas la fonction déclaration en haut et vous
aviez l'implémentation ci-dessus où vous l'appelait, vous ne verrez pas non
plus l'erreur car le compilateur va connaître la fonction
avant d'essayer de l'invoquer.
Donc si nous construisons ceci, vous êtes aussi va voir qu'il n'y a pas d'erreur.
Maintenant, j'ai mentionné que vous habituellement voulez déclarer toutes vos fonctions
au sommet juste pour une bonne pratique et je pense que vous devez le faire.
Alors continuez à faire ça.
Mais si tu sors de ça habitude, vous devez soit déclarer vos fonctions
avant de les appeler ou vous devez fournir des prototypes
de fonction parce que vous ne voulez pas avertissements ou erreurs dans votre programme.
C'est ainsi que vous pouvez définir un fonction, et c'est ainsi que vous pouvez
utiliser des prototypes de fonction.
Dans la prochaine conférence, nous
allons parler des paramètres.
Comment vous pouvez transmettre des données à une fonction.
Merci.