La plupart des langages de programmation vous permettent de découper un programme compliqué et de longue durée en morceaux soignés et nommés. Ces morceaux sont appelés fonctions. Ils vous permettent de réutiliser le code au lieu de réécrire encore et encore la même logique. Une fonction prend des entrées, appelées paramètres, et génère un résultat. En C, vous pouvez transmettre autant de paramètres que nécessaire. Le compilateur ne se soucie pas de l’ordre des fonctions dans votre fichier source, tant qu’il connaît le nom de la fonction avant d’essayer de l’exécuter.
Nous en avons brièvement parlé avec la fonction rand. C’est la fonction la plus simple possible. Cela ne prend rien et renvoie un entier.
La ligne int rand() indique au compilateur que rand est une fonction. Il n’accepte aucun paramètre et renvoie un entier. Cette version spécifique n’a pas de variables locales. Si c’était le cas, ils se trouveraient juste en dessous de l’accolade ouvrante {. C vous permet de déclarer des variables n’importe où après un {. Ils existent jusqu’à ce que le } correspondant soit atteint. Puis ils disparaissent. Tant qu’elles sont actives, les variables locales vivent sur la pile système.
Notez l’absence de point-virgule après rand(). Si vous en insérez un accidentellement, vous obtiendrez une énorme cascade de messages d’erreur du compilateur qui n’ont aucun sens. Même sans paramètres, vous devez utiliser les parenthèses. Sans eux, vous ne déclarez pas de fonction. Vous déclarez simplement un entier.
La déclaration de retour et les multiples points de sortie
L’instruction return est essentielle pour toute fonction qui fournit un résultat. Il définit la valeur à renvoyer et quitte immédiatement la fonction. Vous pouvez placer plusieurs instructions return dans une seule fonction pour créer plusieurs points de sortie.
Si vous oubliez l’instruction return dans une fonction qui doit renvoyer une valeur, la fonction se termine lorsqu’elle atteint l’accolade fermante. Il renvoie une valeur aléatoire et inutile. La plupart des compilateurs modernes vous avertiront si vous ne parvenez pas à renvoyer une valeur spécifique. C prend en charge le renvoi de n’importe quel type : int, float, char, struct, et plus encore.
Il existe plusieurs façons correctes d’appeler la fonction rand. La plus courante est l’affectation :
Ici, la variable « x » obtient la valeur renvoyée par « rand ». Vous devez inclure les parenthèses dans l’appel, même s’il n’y a aucun paramètre. Sans eux, x reçoit l’adresse mémoire de la fonction rand. C’est rarement ce que vous souhaitiez.
Vous pouvez également l’appeler dans une condition :
Ou ignorez simplement le résultat :
Dans le dernier cas, la fonction s’exécute mais la valeur renvoyée est ignorée. Vous ne voudrez peut-être pas faire cela avec rand, mais de nombreuses fonctions utilisent la valeur de retour comme code d’erreur. Si vous savez qu’une erreur est impossible, vous pouvez supprimer le code.
Gestion des retours annulés
Parfois, vous ne voulez rien rendre. Vous utilisez un type de retour void pour cela.
Cette fonction génère du texte mais ne renvoie aucune valeur. Tu l’appelles ainsi :
Encore une fois, incluez les parenthèses. Si vous les omettez, la fonction n’est pas appelée. Il compilera correctement sur de nombreux systèmes, mais ne fera rien.
Paramètres et code C à l’ancienne
Les fonctions C peuvent accepter des paramètres de n’importe quel type. Voici une fonction qui calcule la factorielle d’un nombre :
Le paramètre « i » est transmis sous forme d’entier. Pour transmettre plusieurs paramètres, séparez-les par des virgules.
C a évolué. Vous verrez occasionnellement du code plus ancien écrit dans « l’ancien style ». Cela ressemble à ceci :
Vous devez être capable de lire cette ancienne notation. Il s’exécute exactement de la même manière. C’est juste une syntaxe différente. Vous devez utiliser le « nouveau style », connu sous le nom de ANSI C, où les types sont déclarés dans la liste des paramètres. N’utilisez l’ancien style que si vous savez que vous envoyez du code à une personne disposant d’un compilateur non ANSI.
Pourquoi c’est important pour les utilisateurs quotidiens
Vous n’écrivez peut-être pas de fonctions C quotidiennement. Mais comprendre leur fonctionnement change votre perception des logiciels. Chaque fois que vous cliquez sur un bouton dans une application Web, une fonction traite probablement ce clic, vérifie les paramètres et renvoie un statut. Si vous avez déjà constaté une « erreur d’exécution » ou un « débordement de pile », vous avez rencontré les limites de ces mécanismes.
La distinction entre passer une valeur et passer une référence (l’adresse mémoire) est une source courante de bugs. Dans les langages de haut niveau, cela est souvent caché. En C, c’est explicite. Sachant que rand sans parenthèses renvoie une adresse, pas un numéro, permet d’économiser des heures de débogage.
Le débat entre l’ancien et le nouveau style est largement réglé pour les nouveaux projets. ANSI C est la norme. Mais les bases de code existantes existent toujours. Savoir lire int add(i,j) int i; int j; vous évite de rester bloqué sur un code qui semble erroné mais qui fonctionne parfaitement. C’est une question d’alphabétisation.
La pile compte-t-elle vraiment pour vous ? Si votre programme plante de manière inattendue, la trace de la pile est votre seul indice. Les variables locales qui disparaissent lorsqu’elles frappent l’accolade fermante ne sont pas un bug. C’est une fonctionnalité. Il permet de prévoir l’utilisation de la mémoire.
Il n’existe pas de manière parfaite d’écrire du code. Il n’y a qu’une manière de compiler et une autre de ne pas compiler. Gardez les parenthèses. Surveillez vos retours. Et ne présumez pas que le compilateur vous épargnera vos propres erreurs de syntaxe. Ce ne sera pas le cas.






































