Funktioner i C-programmering med exempel: Rekursiv & Inline
โก Smart sammanfattning
Funktioner i C-programmering รคr รฅteranvรคndbara kodblock som delar upp ett stort program i mindre delprogram, vilket gรถr det lรคttare att fรถrstรฅ, testa och modifiera. Varje funktion har en deklaration, en definition och en anropsdel.

Vad รคr en funktion i C?
Funktion i C-programmering รคr ett รฅteranvรคndbart kodblock som gรถr ett program lรคttare att fรถrstรฅ, testa och enkelt kan modifieras utan att รคndra det anropande programmet. Funktioner delar upp koden och modulariserar programmet fรถr bรคttre och effektivare resultat. Kort sagt รคr ett stรถrre program uppdelat i olika delprogram som anropas som funktioner.
Nรคr du delar upp ett stort program i olika funktioner blir det enkelt att hantera varje funktion individuellt. Nรคrhelst ett fel uppstรฅr i programmet kan du enkelt undersรถka felaktiga funktioner och korrigera endast dessa fel. Du kan enkelt ringa och anvรคnda funktioner nรคrhelst de behรถvs, vilket automatiskt leder till att du sparar tid och utrymme.
Bibliotek vs. Anvรคndardefinierade funktioner
Varje 'C'-program har minst en funktion som รคr huvudfunktionen, men ett program kan ha hur mรฅnga funktioner som helst. Huvudfunktionen () i C รคr en startpunkt fรถr ett program.
I 'C'-programmering รคr funktioner indelade i tvรฅ typer:
- Bibliotekets funktioner
- Anvรคndardefinierade funktioner
Skillnaden mellan biblioteket och anvรคndardefinierade funktioner i C รคr att vi inte behรถver skriva en kod fรถr en biblioteksfunktion. Den finns redan i rubrikfilen som vi alltid inkluderar i bรถrjan av ett program. Du behรถver bara skriva in namnet pรฅ en funktion och anvรคnda den tillsammans med rรคtt syntax. Printf, scanf รคr exempel pรฅ en biblioteksfunktion.
Medan en anvรคndardefinierad funktion รคr en typ av funktion dรคr vi mรฅste skriva en funktionskropp och anropa funktionen nรคr vi krรคver att funktionen ska utfรถra nรฅgon operation i vรฅrt program.
En anvรคndardefinierad funktion i C skrivs alltid av anvรคndaren, men senare kan den vara en del av 'C'-biblioteket. Det รคr en stor fรถrdel med "C"-programmering.
C programmeringsfunktioner รคr indelade i tre aktiviteter som,
- Funktionsdeklaration
- Funktionsdefinition
- Funktionssamtal
Funktionsdeklaration
Funktionsdeklaration innebรคr att skriva namnet pรฅ ett program. Det รคr en obligatorisk del fรถr att anvรคnda funktioner i kod. I en funktionsdeklaration anger vi bara namnet pรฅ en funktion som vi ska anvรคnda i vรฅrt program, likt en variabeldeklaration. Vi kan inte anvรคnda en funktion om den inte deklareras i ett program. En funktionsdeklaration kallas ocksรฅ fรถr "funktionsprototyp".
Funktionsdeklarationerna (kallad prototyp) gรถrs vanligtvis ovanfรถr huvudfunktionen () och har den allmรคnna formen:
return_data_type function_name (data_type arguments);
- return_data_type: รคr datatypen fรถr vรคrdefunktionen som returneras tillbaka till den anropande programsatsen.
- Funktionsnamnet: fรถljs av parenteser
- Argumentnamn med deras datatypdeklarationer placeras valfritt inom parenteser.
Vi betraktar fรถljande program som visar hur man deklarerar en kubfunktion fรถr att berรคkna kubvรคrdet fรถr en heltalsvariabel
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
Tรคnk pรฅ att en funktion inte nรถdvรคndigtvis returnerar ett vรคrde. I det hรคr fallet anvรคnds nyckelordet void.
Till exempel indikerar funktionsdeklarationen output_message att funktionen inte returnerar ett vรคrde: void output_message();
Funktionsdefinition
Funktionsdefinition betyder att bara skriva en funktions brรถdtext. En funktionskropp bestรฅr av uttalanden som ska utfรถra en specifik uppgift. En funktionskropp bestรฅr av en enda eller ett block av satser. Det รคr ocksรฅ en obligatorisk del av en funktion.
int add(int a,int b) //function body { int c; c=a+b; return c; }
Funktionssamtal
Ett funktionsanrop innebรคr att anropa en funktion nรคrhelst det behรถvs i ett program. Nรคr vi anropar en funktion utfรถr den en operation som den รคr designad fรถr. Ett funktionsanrop รคr en valfri del av ett program.
result = add(4,5);
Hรคr รคr den kompletta koden:
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { int c; c=a+b; return c; }
Produktion:
Addition:30
Funktionsargument
En funktions argument anvรคnds fรถr att ta emot de nรถdvรคndiga vรคrdena av funktionsanropet. De matchas efter position; det fรถrsta argumentet skickas till den fรถrsta parametern, det andra till den andra parametern och sรฅ vidare.
Som standard skickas argumenten efter vรคrdet dรคr en kopia av data ges till den anropade funktionen. Den faktiskt skickade variabeln kommer inte att รคndras.
Vi รถvervรคger fรถljande program som visar parametrar som skickas av vรคrde:
int add (int x, int y); int main() { int a, b, result; a = 5; b = 10; result = add(a, b); printf("%d + %d\ = %d\n", a, b, result); return 0;} int add (int x, int y) { x += y; return(x);}
Programutgรฅngen รคr:
5 + 10 = 15
Tรคnk pรฅ att vรคrdena fรถr a och b skickades fรถr att lรคgga till funktion inte รคndrades eftersom endast dess vรคrde skickades till parametern x.
Variabelt omfรฅng
Variabelt omfattning betyder synligheten av variabler i en kod i programmet.
I C รคr variabler som deklareras inuti en funktion lokala fรถr det kodblocket och kan inte refereras till utanfรถr funktionen. Variabler som deklareras utanfรถr alla funktioner รคr dรคremot globala och tillgรคngliga frรฅn hela programmet. Konstanter som deklareras med ett #define hรถgst upp i ett program รคr tillgรคngliga frรฅn hela programmet. Vi betraktar fรถljande program som skriver ut vรคrdet pรฅ den globala variabeln frรฅn bรฅde huvud- och anvรคndardefinierade funktioner:
#include <stdio.h> int global = 1348; void test(); int main() { printf("from the main function : global =%d \n", global); test () ; return 0;} void test (){ printf("from user defined function : global =%d \n", global);}
Resultat:
from the main function : global =1348 from user defined function : global =1348
Vi diskuterar programdetaljerna:
- Vi deklarerar en global heltalsvariabel med 1348 som initialvรคrde.
- Vi deklarerar och definierar en test()-funktion som varken tar argument eller returnerar ett vรคrde. Den hรคr funktionen skriver bara ut det globala variabelvรคrdet fรถr att visa att de globala variablerna kan nรฅs var som helst i programmet.
- Vi skriver ut den globala variabeln inom huvudfunktionen.
- Vi anropar testfunktionen fรถr att skriva ut det globala variabelvรคrdet.
I C, nรคr argument skickas till funktionsparametrar, fungerar parametrarna som lokala variabler som kommer att fรถrstรถras nรคr funktionen avslutas.
Nรคr du anvรคnder globala variabler, anvรคnd dem med fรถrsiktighet eftersom de kan leda till fel och de kan รคndras var som helst i ett program. De bรถr initieras fรถre anvรคndning.
Statiska variabler
De statiska variablerna har en lokal rรคckvidd. De fรถrstรถrs dock inte nรคr funktionen avslutas. Dรคrfรถr behรฅller en statisk variabel sitt vรคrde fรถr alltid och kan nรฅs nรคr funktionen รฅterinfรถrs. En statisk variabel initieras nรคr den deklareras och behรถver prefixet static.
Fรถljande program anvรคnder en statisk variabel:
#include <stdio.h> void say_hi(); int main() { int i; for (i = 0; i < 5; i++) { say_hi();} return 0;} void say_hi() { static int calls_number = 1; printf("Hi number %d\n", calls_number); calls_number ++; }
Programmet visar:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
Rekursiva funktioner
Betrakta faktorialen fรถr ett tal som berรคknas enligt fรถljande 6! = 6 * 5 * 4 * 3 * 2 * 1.
Denna berรคkning gรถrs som att upprepade gรฅnger berรคkna fakta * (faktum -1) tills faktum รคr lika med 1.
En rekursiv funktion รคr en funktion som anropar sig sjรคlv och inkluderar ett utgรฅngsvillkor fรถr att avsluta de rekursiva anropen. I fallet med berรคkningen av faktornummer รคr utgรฅngsvillkoret faktum lika med 1. Rekursion fungerar genom att "stapla" anrop tills utgรฅngsvillkoret รคr sant.
Till exempel:
#include <stdio.h> int factorial(int number); int main() { int x = 6; printf("The factorial of %d is %d\n", x, factorial(x)); return 0;} int factorial(int number) { if (number == 1) return (1); /* exiting condition */ else return (number * factorial(number - 1)); }
Programmet visar:
The factorial of 6 is 720
Hรคr diskuterar vi programdetaljer:
- Vi deklarerar vรฅr rekursiva faktorialfunktion som tar en heltalsparameter och returnerar faktorialen fรถr denna parameter. Denna funktion anropar sig sjรคlv och minskar numret tills utgรฅngen eller basvillkoret uppnรฅs. Nรคr villkoret รคr sant kommer de tidigare genererade vรคrdena att multipliceras med varandra och det slutliga faktorvรคrdet returneras.
- Vi deklarerar och initierar en heltalsvariabel med vรคrdet โ6โณ och skriver sedan ut dess faktorvรคrde genom att anropa vรฅr faktoriella funktion.
Betrakta fรถljande diagram fรถr att bรคttre fรถrstรฅ den rekursiva mekanismen som bestรฅr av att anropa funktionen tills basfallet eller stoppet nรฅs.ping villkoret รคr uppnรฅtt, och dรคrefter samlar vi in โโde tidigare vรคrdena:
Inline -funktioner
Funktion i C-programmering anvรคnds fรถr att lagra de mest anvรคnda instruktionerna. Den anvรคnds fรถr att modularisera programmet.
Nรคrhelst en funktion anropas, hoppar instruktionspekaren till funktionsdefinitionen. Efter att ha kรถrt en funktion faller instruktionspekaren tillbaka till satsen varifrรฅn den hoppade till funktionsdefinitionen.
Nรคr vi anvรคnder funktioner behรถver vi en extra pekare gรฅ till funktionsdefinitionen och รฅtergรฅ till satsen. Fรถr att eliminera behovet av sรฅdana pekhuvuden anvรคnder vi inline-funktioner.
I en inline-funktion ersรคtts ett funktionsanrop direkt av en faktisk programkod. Den hoppar inte till nรฅgot block eftersom alla operationer utfรถrs i inline-funktionen.
Inline-funktioner anvรคnds mest fรถr smรฅ berรคkningar. De รคr inte lรคmpliga nรคr stora datorer รคr inblandade.
En inline-funktion liknar den normala funktionen fรถrutom att nyckelordet inline รคr placerat fรถre funktionsnamnet. Inline-funktioner skapas med fรถljande syntax:
inline function_name ()
{
//function definition
}
Lรฅt oss skriva ett program fรถr att implementera en inline-funktion.
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
Produktion:
Addition: 30
Programmet ovan visar anvรคndningen av en inline-funktion fรถr addition av tvรฅ tal. Som vi kan se har vi endast returnerat tillรคgget pรฅ tvรฅ siffror inom inline-funktionen utan att skriva nรฅgra extra rader. Under funktionsanrop har vi precis skickat vรคrden som vi mรฅste gรถra addition.




