Каждая программа на языке C представляет собой набор функций. Узнайте все об этих полезных фрагментах кода, которые можно повторно использовать, от того, как их определять до того, что означает void.
Возможно, вы рассмотрели базовый синтаксис C на простых примерах и теперь задаетесь вопросом, как создавать более крупные, реальные программы. Для начала вам нужно организовать свой код на эффективные части с минимальным повторением. В C, как и в большинстве языков, ответом на ваши проблемы является функция.
Создание и использование функций в C просты и дают множество преимуществ. Функции позволяют разбивать сложные программы на более мелкие части. Они обеспечивают возможность повторного использования как внутри исходной программы, так и в связанных библиотеках или других отдельных программах.
Для начала вам необходимо узнать об объявлениях функций, прототипах, параметрах и операторах возврата.
Что такое функции в C?
В программировании на Си, функция — это именованный раздел кода, который делает что-то, когда вы об этом просите. Это помогает поддерживать порядок в коде и позволяет использовать одно и то же действие несколько раз, не повторяясь.
Самый простой пример — тот, который вы уже использовали: функция main(). Функция 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 принимает целочисленный параметр: число.
- Функция Square вычисляет квадрат числа, обновляет его значение и возвращает это новое значение.
- Основная функция объявляет целочисленную переменную, Икси присваивает ему значение 5.
- Затем он вызывает функцию Square, передавая ей значение 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;
}
- квадрат функция принимает целочисленный указатель (интервал *) параметр, число. Он не возвращает значение.
- Функция Square вычисляет квадрат значения, которое число содержит и обновляет это значение с помощью оператора разыменования указателя, *.
- основной функция объявляет целочисленную переменную, Икси присваивает ему значение 5.
- Затем он вызывает квадрат функция с указателем на Икс используя оператор адреса: &Икс.
- После вызова функции main печатает значение Икс, что сейчас 25 поскольку изменения в *номер внутри квадрат функция влияет на оригинал Икс.
Таким образом, ключевое различие между этими двумя методами заключается в том, как изменения параметра внутри функции влияют на исходное значение вне ее. Передача по значению создает копию, а передача по ссылке (указателю) позволяет напрямую манипулировать исходным значением.
В других языках часто есть эквивалент указателей C, но они обычно работают на более высоком уровне. Одним из примеров является Поддержка C# для выходных переменных.
Пустые функции
Пустые функции в программировании на 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 и хотите бросить вызов себе, подумайте о рекурсии.