Met de meeste programmeertalen kun je een rommelig, langlopend programma opdelen in nette, benoemde stukjes. Deze chunks worden functies genoemd. Ze stellen u in staat code opnieuw te gebruiken in plaats van dezelfde logica steeds opnieuw te schrijven. Een functie neemt invoer, ook wel parameters genoemd, en spuugt een resultaat uit. In C kunt u zoveel parameters doorgeven als u nodig heeft. De compiler maakt zich niets uit over de volgorde van de functies in uw bronbestand, zolang hij maar de naam van de functie kent voordat hij deze probeert uit te voeren.
We hebben dit kort besproken met de functie rand. Het is de eenvoudigst mogelijke functie. Er is niets nodig en het geeft een geheel getal terug.
De regel int rand() vertelt de compiler dat rand een functie is. Het accepteert geen parameters en retourneert een geheel getal. Deze specifieke versie heeft geen lokale variabelen. Als dat zo was, zouden ze precies onder de openingsbeugel { zitten. Met C kun je variabelen ergens na een { declareren. Ze blijven bestaan totdat de overeenkomende } wordt gevonden. Dan verdwijnen ze. Terwijl ze leven, leven lokale variabelen op de systeemstack.
Let op het ontbreken van een puntkomma na rand(). Als je er per ongeluk een invoert, krijg je een enorme reeks foutmeldingen van de compiler die nergens op slaan. Zelfs als er geen parameters zijn, moet u de haakjes gebruiken. Zonder deze declareert u geen functie. Je declareert gewoon een geheel getal.
De retourverklaring en meerdere exitpunten
De instructie return is van cruciaal belang voor elke functie die een resultaat oplevert. Het stelt de waarde in die moet worden geretourneerd en verlaat de functie onmiddellijk. U kunt meerdere retourinstructies in één functie plaatsen om meerdere exitpunten te creëren.
Als u de return-instructie vergeet in een functie die een waarde moet retourneren, wordt de functie afgesloten wanneer deze de sluitende accolade raakt. Het retourneert een willekeurige waarde. De meeste moderne compilers zullen u waarschuwen als u er niet in slaagt een specifieke waarde terug te geven. C ondersteunt het retourneren van elk type: int, float, char, struct en meer.
Er zijn verschillende correcte manieren om de functie rand aan te roepen. De meest voorkomende is toewijzing:
Hier krijgt de variabele x de waarde die wordt geretourneerd door rand. U moet de haakjes in de aanroep opnemen, zelfs als er geen parameters zijn. Zonder deze ontvangt x het geheugenadres van de functie rand. Dat is zelden wat je bedoelde.
Je kunt het ook binnen een voorwaarde noemen:
Of negeer eenvoudigweg het resultaat:
In het laatste geval wordt de functie uitgevoerd, maar wordt de geretourneerde waarde verwijderd. Misschien wilt u dit niet doen met rand, maar veel functies gebruiken de geretourneerde waarde als foutcode. Als je weet dat een fout onmogelijk is, is het prima om de code te verwijderen.
Ongeldige retouren afhandelen
Soms wil je niets retourneren. Je gebruikt hiervoor een retourtype void.
Deze functie voert tekst uit, maar retourneert geen waarde. Je noemt het zo:
Voeg opnieuw de haakjes toe. Als u ze weglaat, wordt de functie niet aangeroepen. Het zal op veel systemen correct compileren, maar het zal niets doen.
Parameters en ouderwetse C-code
C-functies kunnen parameters van elk type accepteren. Hier is een functie die de faculteit van een getal berekent:
De parameter i wordt doorgegeven als een geheel getal. Als u meerdere parameters wilt doorgeven, scheidt u ze met komma’s.
C is geëvolueerd. Af en toe zul je oudere code tegenkomen die in de ‘oude stijl’ is geschreven. Het ziet er zo uit:
Je moet deze oude notatie kunnen lezen. Het wordt op precies dezelfde manier uitgevoerd. Het is gewoon een andere syntaxis. U moet de ‘nieuwe stijl’ gebruiken, bekend als ANSI C, waarbij typen worden gedeclareerd in de parameterlijst. Gebruik de oude stijl alleen als u weet dat u de code verzendt naar iemand met een niet-ANSI-compiler.
Waarom dit belangrijk is voor dagelijkse gebruikers
Het kan zijn dat u niet dagelijks C-functies schrijft. Maar als u begrijpt hoe ze werken, verandert de manier waarop u over software denkt. Elke keer dat u op een knop in een webapp klikt, verwerkt een functie die klik waarschijnlijk, controleert de parameters en retourneert een status. Als je ooit een ‘runtime error’ of een ‘stack overflow’ hebt gezien, ben je de grenzen van deze mechanismen tegengekomen.
Het onderscheid tussen het doorgeven van een waarde en het doorgeven van een referentie (het geheugenadres) is een veelvoorkomende bron van bugs. In talen op hoog niveau is dit vaak verborgen. In C is het expliciet. Wetende dat rand zonder haakjes een adres retourneert, en geen getal, scheelt uren aan foutopsporing.
Het debat oude versus nieuwe stijl wordt grotendeels beslecht voor nieuwe projecten. ANSI C is de standaard. Maar er bestaan nog steeds verouderde codebases. Weten hoe je int add(i,j) int i moet lezen; int j; voorkomt dat u vastloopt in code die er verkeerd uitziet, maar perfect werkt. Het is een kwestie van geletterdheid.
Vind je de stapel echt belangrijk? Als uw programma onverwacht crasht, is de stacktrace uw enige aanwijzing. Lokale variabelen die verdwijnen wanneer ze de sluitende accolade raken, zijn geen bug. Het is een kenmerk. Het houdt het geheugengebruik voorspelbaar.
Er bestaat geen perfecte manier om code te schrijven. Er is alleen een manier die compileert en een manier die dat niet doet. Bewaar de haakjes. Let op uw rendement. En ga er niet vanuit dat de compiler u zal behoeden voor uw eigen syntaxisfouten. Dat zal niet gebeuren.








































