Всяка C програма е набор от функции. Научете всичко за тези полезни части от код за многократна употреба, от това как да ги дефинирате до това какво означава void.
Може да сте обхванали основния синтаксис на С с прости примери и сега се чудите как да създадете по-големи програми от реалния свят. Като начало ще искате да организирате кода си в ефективни части с минимално повторение. В C, както в повечето езици, отговорът на вашите проблеми е функцията.
Създаването и използването на функции в C е лесно и носи много предимства. Функциите ви позволяват да разделяте сложни програми на по-малки части. Те осигуряват повторна употреба, както във вашата оригинална програма, така и в свързани библиотеки или други отделни програми.
За да започнете, ще трябва да научите за декларации на функции, прототипи, параметри и оператори за връщане.
Какво представляват функциите в C?
В програмирането на C, функцията е наименуван раздел от код, който прави нещо, когато го помолите. Той помага да поддържате кода си организиран и ви позволява да използвате едно и също действие няколко пъти, без да се повтаряте.
Най-простият пример е този, който вече сте използвали: функцията main(). Основната функция е особено специална, защото действа като основна входна точка за всяка C програма. Можете също така да използвате библиотечни функции, които са тези, които някой друг вече е написал, или можете да напишете свои собствени дефинирани от потребителя функции.
Функции: деклариране, дефиниране и извикване
Тези три аспекта са основни за използването на функциите.
Декларация на функция
Това предоставя информация за името на функцията, типа на връщане и параметрите, позволявайки нейното използване преди пълната й дефиниция. Нарича се още прототип на функция. Следва този прост синтаксис:
return_type function_name(parameters);
Където:
- тип_връщане е типът данни на стойността, която функцията връща. Може да бъде всеки валиден C тип данни или невалиден ако функцията не върне стойност.
- име_на_функция е името, което давате на функцията. Ще използвате това, за да извикате функцията по-късно.
- параметри е списък с входни параметри, които функцията приема, ако има такива. Всеки параметър се състои от тип данни, последван от име на параметър, разделено със запетаи.
Например, ето проста декларация на функция:
intadd(int a, int b);
Определение на функцията
Когато извикате функция, тя изпълнява кода, посочен в нейната дефиниция. Той включва името на функцията, типа на връщане, списъка с параметри и изразите, които определят нейното поведение. Ето синтаксиса:
return_type function_name(parameters){
// Function body - code that defines what the function does
// Return a value if applicable
return value;
}
Нека разбием части от синтаксиса:
Функционално тяло: Това е блокът от код, ограден във фигурни скоби {}. Той съдържа инструкциите, които определят какво прави функцията, когато бъде извикана.
Изявление за връщане: Ако функцията има тип връщане, различен от невалиден, на връщане изразът изпраща стойност обратно на повикващия. Тази стойност трябва да съответства на указания тип връщане.
Ето прост пример за дефиниция на функция:
intadd(int a, int b){
int sum = a + b;
return sum;
}
Извикване на функция
Точно както при готвенето, може да имате рецепта (дефиниция на функция) и някои съставки (аргументи), но все пак трябва да следвате инструкциите, за да получите резултат. Извикването на функция ще изпълни функцията с дадени аргументи; ето синтаксиса:
return_type result = function_name(arguments);
аргументи: Това са стойностите или изразите, които предавате на функцията като входове. Разделете всеки аргумент със запетая. Броят, редът и типовете данни на аргументите трябва да съответстват на списъка с параметри на функцията.
резултат: Ако функцията има тип връщане, различен от невалиден, можете да заснемете върнатата стойност, като използвате променлива от подходящия тип данни.
Ето пример за извикване на функция:
#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;
}
Следвайки тези три стъпки - деклариране на функцията, предоставяне на нейната реализация и извикването й с подходящи аргументи – можете ефективно да използвате функции за изпълнение на различни задачи във вашия програма.
Функционални параметри и връщани стойности
Параметрите са променливи, декларирани в декларацията или дефиницията на функцията, които действат като контейнери за стойностите, предадени на функцията при извикване. Те ви позволяват да предавате данни във функцията, позволявайки й да работи с тези данни и да ги манипулира. Върнатите стойности са стойностите, които функцията произвежда и изпраща обратно на повикващия.
Има два метода за предаване на параметри.
Преминаване по стойност
С този подход извикването на функция копира стойността на действителния аргумент в параметъра на функцията. Промените, направени в параметъра във функцията, не засягат оригиналния аргумент.
Например:
#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;
}
- Квадратната функция приема целочислен параметър, бр.
- Функцията square изчислява квадрата на num, актуализира стойността си и връща тази нова стойност.
- Основната функция декларира целочислена променлива, хи му присвоява стойност 5.
- След това извиква квадратната функция, като й предава стойността на x. Той присвоява резултата на втора променлива, г.
- След извикването на функцията main отпечатва стойностите на x и y. Стойността x остава същата, защото промяната на параметъра num вътре в квадрата не засяга оригиналния x.
Преминаване по справка
Използвайки този подход, предавате адреса на паметта (указателя) на стойност към функция. Промените, направени в параметъра във функцията, засягат оригиналната стойност извън нея.
Указателите, включително използването им като параметри, са един от аспектите на C, които го правят различен от език като 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 квадрат функцията приема целочислен указател (int *) параметър, бр. Не връща стойност.
- Функцията квадрат изчислява квадрата на стойността, която бр съдържа и актуализира тази стойност с помощта на оператора за деименуване на указател, *.
- The основен функцията декларира целочислена променлива, х, и му присвоява стойността 5.
- След това извиква квадрат функция с указател към х използвайки адреса на оператора: &х.
- След извикването на функцията main отпечатва стойността на х, което е сега 25 след промените в *бр вътре в квадрат функция засяга оригинала х.
В обобщение, ключовата разлика между двата метода е как промените в параметъра във функцията влияят върху първоначалната стойност извън нея. Преминаването по стойност създава копие, докато предаването по референция (указател) позволява директно манипулиране на оригиналната стойност.
Други езици често имат еквивалент на указателите на C, но те обикновено работят на по-високо ниво. Един пример е Поддръжка на C# за изходящи променливи.
Празни функции
Void функциите в C програмирането са функции, които не връщат стойност. Използвайте ги, за да извършвате действия или задачи, без да давате резултат. Те могат да променят своите параметри, като използват прехвърляне по референция, но не е необходимо.
Ето пример за void функция:
#include
// Void function with no parameters
voidgreet(){
printf("Hello, MUO!");
}intmain(){
// Call the void function, output: "Hello, MUO!"
greet();
return0;
}
Void функциите са полезни за извършване на действия, отпечатване на съобщения, модифициране на данни или изпълнение на задачи, без да се изисква връщана стойност.
Разгледайте функциите в C програмирането
Практикуването чрез създаване на функции подобрява разбирането ви за разбиране и приложение в C програмирането. Освен това, той повишава четливостта на кода и лесната поддръжка. Потопете се в различни приложения на функции, за да отключите техните предимства.
Когато усвоите основите на C функциите и искате да предизвикате себе си, помислете дали да се задълбочите в рекурсията.