Iga C-programm on funktsioonide kogum. Siit saate teada kõike nende kasulike korduvkasutatavate kooditükkide kohta, alates nende määratlemisest kuni tühisuse tähenduseni.
Võib-olla olete käsitlenud C-põhist süntaksit lihtsate näidetega ja mõtlete nüüd, kuidas luua suuremaid reaalmaailma programme. Alustuseks võiksite oma koodi minimaalse kordusega korraldada tõhusateks osadeks. C-keeles, nagu enamikus keeltes, on vastus teie probleemidele funktsioon.
Funktsioonide loomine ja kasutamine C-s on lihtne ja toob palju eeliseid. Funktsioonid võimaldavad jagada keerulised programmid väiksemateks tükkideks. Need pakuvad korduvkasutatavust nii teie algprogrammis kui ka seotud teekides või muudes eraldi programmides.
Alustuseks peate õppima funktsioonide deklaratsioonide, prototüüpide, parameetrite ja tagastuslausete kohta.
Mis on funktsioonid C-s?
C programmeerimisel, funktsioon on nimega koodiosa, mis teeb midagi, kui te seda palute. See aitab teie koodi korras hoida ja võimaldab teil kasutada sama toimingut mitu korda ilma ennast kordamata.
Lihtsaim näide on see, mida olete juba kasutanud: funktsioon main(). Põhifunktsioon on eriti eriline, kuna see toimib mis tahes C-programmi peamise sisenemispunktina. Võite kasutada ka teegi funktsioone, mis on need, mille keegi teine on juba kirjutanud, või saate kirjutada oma kasutaja määratud funktsioone.
Funktsioonid: deklareerimine, määratlemine ja kutsumine
Need kolm aspekti on funktsioonide kasutamisel põhilised.
Funktsiooni deklaratsioon
See annab teavet funktsiooni nime, tagastustüübi ja parameetrite kohta, võimaldades seda kasutada enne selle täielikku määratlust. Seda nimetatakse ka funktsiooni prototüübiks. See järgib seda lihtsat süntaksit:
return_type function_name(parameters);
Kus:
- tagastamise_tüüp on funktsiooni tagastatava väärtuse andmetüüp. See võib olla mis tahes kehtiv C-andmetüüp või tühine kui funktsioon väärtust ei tagasta.
- funktsiooni_nimi on nimi, mille annate funktsioonile. Kasutate seda funktsiooni hiljem helistamiseks.
- parameetrid on sisendparameetrite loend, mida funktsioon aktsepteerib, kui neid on. Iga parameeter koosneb andmetüübist, millele järgneb komadega eraldatud parameetri nimi.
Näiteks siin on lihtne funktsiooni deklaratsioon:
intadd(int a, int b);
Funktsiooni definitsioon
Funktsiooni kutsumisel käivitab see selle definitsioonis määratud koodi. See sisaldab funktsiooni nime, tagastustüüpi, parameetrite loendit ja selle käitumist määravaid avaldusi. Siin on süntaks:
return_type function_name(parameters){
// Function body - code that defines what the function does
// Return a value if applicable
return value;
}
Jaotame süntaksi osad:
Funktsiooni keha: see on koodiplokk, mis on suletud sulgudes {}. See sisaldab juhiseid, mis määravad, mida funktsioon selle kutsumisel teeb.
Tagastusavaldus: kui funktsiooni tagastustüüp on muu kui tühine, tagasi avaldus saadab väärtuse helistajale tagasi. See väärtus peaks vastama määratud tagastustüübile.
Siin on lihtne näide funktsiooni määratlusest:
intadd(int a, int b){
int sum = a + b;
return sum;
}
Funktsiooni helistamine
Nii nagu toiduvalmistamisel, võib teil olla retsept (funktsiooni määratlus) ja mõned koostisosad (argumendid), kuid tulemuse saamiseks peate siiski järgima juhiseid. Funktsioonikutse käivitab funktsiooni antud argumentidega; siin on süntaks:
return_type result = function_name(arguments);
argumendid: need on väärtused või avaldised, mille edastate funktsioonile sisenditena. Eraldage kõik argumendid komaga. Argumentide arv, järjestus ja andmetüübid peaksid ühtima funktsiooni parameetrite loendiga.
tulemus: kui funktsiooni tagastustüüp on muu kui tühine, saate tagastatud väärtuse jäädvustada, kasutades sobivat andmetüüpi muutujat.
Siin on näide funktsioonikutsest:
#include
// Function prototype
intadd(int a, int b);intmain(){
int x = 5, y = 3;// Call the function and store the result in 'sum'
int sum = add(x, y);
printf("The sum of %d and %d is %d\n", x, y, sum);
return0;
}
// Function definition
intadd(int a, int b){
return a + b;
}
Järgides neid kolme sammu – funktsiooni deklareerimine, selle juurutamine ja väljakutsumine sobivate argumentidega – saate funktsioone tõhusalt kasutada erinevate ülesannete täitmiseks programm.
Funktsiooni parameetrid ja tagastusväärtused
Parameetrid on funktsiooni deklaratsioonis või definitsioonis deklareeritud muutujad, mis toimivad funktsiooni kutsumisel edastatavate väärtuste kohahoidjatena. Need võimaldavad teil andmeid funktsioonisse edastada, võimaldades sellel nende andmetega töötada ja nendega manipuleerida. Tagastusväärtused on väärtused, mille funktsioon toodab ja helistajale tagasi saadab.
Parameetrite edastamiseks on kaks meetodit.
Mööduge väärtusest
Selle lähenemisviisi korral kopeerib funktsioonikutse tegeliku argumendi väärtuse funktsiooni parameetrisse. Funktsioonis parameetris tehtud muudatused ei mõjuta algset argumenti.
Näiteks:
#include
intsquare(int num){
num = num * num;
return num;
}intmain(){
int x = 5;
int y = square(x);// Output: x and y after function call: 5 25
printf("x and y after function call: %d %d\n", x, y);
return0;
}
- Ruutfunktsioon võtab täisarvu parameetri, nr.
- Ruutfunktsioon arvutab numbri ruudu, värskendab selle väärtust ja tagastab selle uue väärtuse.
- Põhifunktsioon deklareerib täisarvulise muutuja, xja määrab sellele väärtuse 5.
- Seejärel kutsub see välja ruutfunktsiooni, edastades sellele x väärtuse. See määrab tulemuse teisele muutujale, y.
- Pärast funktsiooni kutsumist prindib main x ja y väärtused. X väärtus jääb samaks, kuna parameetri num muutmine ruudu sees ei mõjuta algset x-i.
Möödu viitest
Seda lähenemisviisi kasutades edastate väärtuse mäluaadressi (osuti) funktsioonile. Funktsiooni sees parameetris tehtud muudatused mõjutavad algväärtust väljaspool seda.
Osutajad, sealhulgas nende kasutamine parameetritena, on üks aspekte C, mis eristavad selle keelest nagu Python.
#include
voidsquare(int *num){
*num = *num * *num;
}intmain(){
int x = 5;
square(&x);
// Output: x after function call: 25
printf("x after function call: %d\n", x);
return0;
}
- The ruut funktsioon võtab täisarvu osuti (int *) parameeter, nr. See ei tagasta väärtust.
- Ruutfunktsioon arvutab selle väärtuse ruudu, mis nr sisaldab ja värskendab seda väärtust, kasutades kursori viiteoperaatorit, *.
- The peamine funktsioon deklareerib täisarvu muutuja, x, ja määrab sellele väärtuse 5.
- Seejärel kutsub see üles ruut funktsioon kursoriga x kasutades operaatori aadressi: &x.
- Pärast funktsiooni kutsumist prindib main väärtuse x, mis on praegu 25 alates muudatustest *nr sees ruut funktsioon mõjutab originaali x.
Kokkuvõtteks võib öelda, et peamine erinevus kahe meetodi vahel seisneb selles, kuidas funktsiooni sees parameetri muudatused mõjutavad algset väärtust väljaspool seda. Väärtusest möödalaskmine loob koopia, viite (osuti) järgi viimine võimaldab algse väärtusega otsest manipuleerimist.
Teistes keeltes on sageli samaväärne C-osutitega, kuid need töötavad üldiselt kõrgemal tasemel. Üks näide on C# tugi muutujatele.
Tühised funktsioonid
Tühised funktsioonid C-programmeerimises on funktsioonid, mis väärtust ei tagasta. Kasutage neid toimingute või ülesannete täitmiseks ilma tulemust andmata. Nad võivad muuta oma parameetreid, kasutades pass by reference, kuid nad ei pea seda tegema.
Siin on tühifunktsiooni näide:
#include
// Void function with no parameters
voidgreet(){
printf("Hello, MUO!");
}intmain(){
// Call the void function, output: "Hello, MUO!"
greet();
return0;
}
Tühifunktsioonid on kasulikud toimingute tegemiseks, sõnumite printimiseks, andmete muutmiseks või ülesannete täitmiseks ilma tagastamisväärtust nõudmata.
Avastage C-programmeerimise funktsioone
Funktsioonide loomise kaudu harjutamine suurendab teie arusaamist C-programmeerimisest ja selle rakendamisest. Lisaks suurendab see koodi loetavust ja hooldamise lihtsust. Sukelduge erinevatesse funktsioonirakendustesse, et avada nende eelised.
Kui olete omandanud C-funktsioonide põhialused ja soovite end proovile panna, kaaluge rekursiooniga tegelemist.