Как объявить функцию в c
Перейти к содержимому

Как объявить функцию в c

  • автор:

Как объявить указатель на функцию в C/C++

Необходимо придерживаться следующей формы объявления:

typedef тип_возвращаемого_значения (*имя_указ)(список_параметров_функции); 
typedef int (*pfn)(int param1, void * param2); 

Отслеживать

ответ дан 20 окт 2010 в 19:19

Nicolas Chabanovsky Nicolas Chabanovsky

51.4k 87 87 золотых знаков 267 267 серебряных знаков 508 508 бронзовых знаков

это еще не указатель на функцию, а его тип

25 янв 2020 в 6:59

Начиная с c++11 можно объявить через using :

using name = retType(*)(params); 
void f(int, int) <> // функция приемлимой сигнатуры using FP = void(*)(int, int); // объявление типа указатель на функцию FP fp = f; // определение и инициализация fp(42, 100500); // вызов функции через указатель 

Функции в программировании на C с примерами: рекурсивные и встроенные

Функция в программировании на C — это многократно используемый блок кода, который упрощает понимание и тестирование программы и который можно легко модифицировать без изменения вызывающей программы. Функции разделяют код и модулируют программу для достижения лучших и эффективных результатов. Короче говоря, большая программа делится на различные подпрограммы, которые называются функциями.

Что такое функция в C

Когда вы разделяете большую программу на различные функции, становится легко управлять каждой функцией индивидуально. Всякий раз, когда в программе возникает ошибка, вы можете легко исследовать ошибочные функции и исправить только эти ошибки. Вы можете легко вызывать и использовать функции, когда они необходимы, что автоматически приводит к экономии времени и места.

Библиотека против. Пользовательские функции

Каждая программа на языке C имеет по крайней мере одну функцию, которая является основной, но программа может иметь любое количество функций. Функция main() в C — это отправная точка программы.

В программировании на языке C функции делятся на два типа:

  1. Библиотечные функции
  2. Пользовательские функции

Разница между библиотечными и пользовательскими функциями в C заключается в том, что нам не нужно писать код для библиотечной функции. Он уже присутствует в заголовочном файле, который мы всегда включаем в начало программы. Вам просто нужно ввести имя функции и использовать его вместе с правильным синтаксисом. Printf, scanf — примеры библиотечных функций.

Принимая во внимание, что определяемая пользователем функция — это тип функции, в котором нам приходится писать тело функции и вызывать ее всякий раз, когда нам требуется, чтобы функция выполнила некоторые действия. operaв нашей программе.

Пользовательская функция в C всегда пишется пользователем, но later он может быть частью библиотеки C. Это главное преимущество программирования на языке C.

Функции программирования на языке C разделены на три вида деятельности, такие как:

  1. Объявление функции
  2. Определение функции
  3. Вызов функции

Объявление функции

Объявление функции означает написание имени программы. Это обязательная часть для использования функций в коде. В объявлении функции мы просто указываем имя функции, которую собираемся использовать в нашей программе, как при объявлении переменной. Мы не можем использовать функцию, если она не объявлена ​​в программе. Объявление функции также называется «Функция». прототип«.

Объявления функций (называемые прототипом) обычно выполняются над функцией main() и имеют общий вид:

return_data_type function_name (data_type arguments);
  • Ассоциация return_data_type: тип данных функции значения, возвращаемой обратно в вызывающую инструкцию.
  • Ассоциация имя_функции: за ним следуют круглые скобки
  • аргументы имена с объявлениями типов данных (необязательно) помещаются в круглые скобки.

Мы рассматриваем следующееwing программа, показывающая, как объявить функцию куба для вычисления кубического значения целочисленной переменной.

#include /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() 

Имейте в виду, что функция не обязательно возвращает значение. В данном случае используется ключевое слово void.

Например, объявление функции output_message указывает, что функция не возвращает значение: void output_message();

Определение функции

Определение функции означает просто написание тела функции. Тело функции состоит из операторов, выполняющих определенную задачу. Тело функции состоит из одного или блока операторов. Это также обязательная часть функции.

int add(int a,int b) //function body

Вызов функции

Вызов функции означает вызов функции всякий раз, когда она требуется в программе. Всякий раз, когда мы вызываем функцию, она выполняет operaция, для которой он был разработан. Вызов функции — это необязательная часть программы.

result = add(4,5);

#include 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

Вывод:

Addition:30

Аргументы функций

Аргументы функции используются для получения необходимых значений при вызове функции. Они соответствуют положению; первый аргумент передается первому параметру, второй — второму параметру и так далее.

По умолчанию аргументы передаются по значению в котором копия данных передается вызываемой функции. Фактически переданная переменная не изменится.

Мы рассматриваем следующееwing программа, которая демонстрирует параметры, передаваемые по значению:

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)

Вывод программы:

5 + 10 = 15

Имейте в виду, что значения a и b, переданные в функцию добавления, не были изменены, поскольку в параметр x было передано только его значение.

Переменная область

Область видимости переменных означает видимость переменных в коде программы.

В C переменные, объявленные внутри функции, являются локальными для этого блока кода и на них нельзя ссылаться вне функции. Однако переменные, объявленные вне всех функций, являются глобальными и доступны из всей программы. Константы, объявленные с помощью #define в верхней части программы доступны из всей программы. Мы рассматриваем следующееwing программа, которая печатает значение глобальной переменной как из основной, так и из определяемой пользователем функции:

#include int global = 1348; void test(); int main() < printf("from the main function : global =%d \n", global); test () ; return 0;>void test ()

from the main function : global =1348 from user defined function : global =1348

Обсуждаем программу деtails:

Переменная область

  1. Мы объявляем целочисленную глобальную переменную с начальным значением 1348.
  2. Мы объявляем и определяем функцию test(), которая не принимает аргументы и не возвращает значения. Эта функция печатает только значение глобальной переменной, чтобы продемонстрировать, что к глобальным переменным можно получить доступ в любом месте программы.
  3. Мы печатаем глобальную переменную внутри основной функции.
  4. Мы вызываем тестовую функцию, чтобы напечатать значение глобальной переменной.

В C, когда аргументы передаются параметрам функции, параметры действуют как локальные переменные, которые будут уничтожены.yed при выходе из функции.

Когда вы используете весы для поддона глобальные переменные, используйте их с осторожностью, поскольку это может привести к ошибкам и они могут измениться в любом месте программы. Перед использованием их следует инициализировать.

Статические переменные

Статические переменные имеют локальную область видимости. Однако они не разрушаютсяyed при выходе из функции. Таким образом, статическая переменная сохраняет свое значение навсегда, и к ней можно получить доступ при повторном входе в функцию. Статическая переменная инициализируется при объявлении и требует префикса static.

Фоллоwing программа использует статическую переменную:

#include void say_hi(); int main() < int i; for (i = 0; i < 5; i++) < say_hi();>return 0;> void say_hi()

Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5

Рекурсивные функции

Рассмотрим факториал числа, которое вычисляется по формуле: 6! =6*5*4*3*2*1.

Этот расчет выполняется как многократное вычисление факта * (факт -1), пока факт не станет равным 1.

Рекурсивная функция — это функция, которая вызывает саму себя и включает условие выхода для завершения рекурсивных вызовов. В случае расчета факториала условием выхода является факт, равный 1. Рекурсия работает путем «наложения» вызовов до тех пор, пока условие выхода не станет истинным.

#include 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)); >
The factorial of 6 is 720

Здесь мы обсуждаем программу деtails:

Рекурсивные функции

  1. Мы объявляем нашу рекурсивную функцию факториала, которая принимает целочисленный параметр и возвращает факториал этого параметра. Эта функция будет вызывать сама себя и уменьшать число до тех пор, пока не будет достигнуто выходное или базовое условие. Если условие истинно, ранее сгенерированные значения будут умножены друг на друга, и будет возвращено окончательное значение факториала.
  2. Мы объявляем и инициализируем целочисленную переменную со значением «6», а затем печатаем ее значение факториала, вызывая нашу функцию факториала.

Рассмотрим следующееwing диаграмма, чтобы лучше понять рекурсивный механизм, который заключается в вызове самой функции до тех пор, пока не будет достигнут базовый случай или условие остановки, и после этого мы собираем предыдущие значения:

Рекурсивные функции

Встроенные функции

Функция в программировании на языке C используется для хранения наиболее часто используемых инструкций. Он используется для модульной организации программы.

Всякий раз при вызове функции указатель инструкции переходит к определению функции. После выполнения функции указатель инструкции возвращается к оператору, из которого он перешел к определению функции.

Всякий раз, когда мы используем функции, нам требуется дополнительный указатель head, чтобы перейти к определению функции и вернуться к оператору. Чтобы устранить необходимость в таких указателях, мы используем встроенные функции.

Во встроенной функции вызов функции напрямую заменяется реальным программным кодом. Он не переходит ни на один блок, потому что все operaВсе действия выполняются внутри встроенной функции.

Встроенные функции в основном используются для небольших вычислений. Они не подходят, когда задействованы большие вычисления.

Встроенная функция аналогична обычной функции, за исключением того, что перед именем функции ставится ключевое слово inline. Встроенные функции создаются с помощью следующегоwing синтаксис:

inline function_name () < //function definition >

Давайте напишем программу для реализации встроенной функции.

inline int add(int a, int b) //inline function declaration < return(a+b); >int main()

Вывод:

Addition: 30

Приведенная выше программа демонстрирует использование встроенной функции для сложения двух numbers. Как мы видим, мы вернули сложение на двух numbers внутри встроенной функции только без написания дополнительных строк. Во время вызова функции мы только что передали значения, которые необходимо сложить.

Обзор

  • Функция — это мини-программа или подпрограмма.
  • Функции используются для модульной организации программы.
  • Библиотечные и пользовательские — это два типа функций.
  • Функция состоит из объявления, тела функции и части вызова функции.
  • Объявление функции и тело являются обязательными.
  • Вызов функции может быть необязательным в программе.
  • Программа C имеет хотя бы одну функцию; это основная функция ().
  • Каждая функция имеет имя, тип данных возвращаемого значения или пустоту, параметры.
  • Каждая функция должна быть определена и объявлена ​​в вашей программе на языке C.
  • Имейте в виду, что обычный переменные в функции C уничтоженыyed как только мы выйдем из вызова функции.
  • Аргументы, переданные функции, не будут изменены, поскольку они передаются по значению, а не по адресу.
  • Область видимости переменных называется видимостью переменных внутри программы.
  • В программе есть глобальные и локальные переменные. C программирование
  • Динамическое распределение памяти в C с использованием функций malloc(), calloc()
  • Приведение типов в C: преобразование типов, неявное, явное с примером
  • Учебное пособие по программированию на C в формате PDF для начинающих
  • 13 ЛУЧШИХ книг по программированию на C для начинающих (обновление 2024 г.)
  • Разница между C и Java
  • Разница между структурой и объединением в C
  • 100 лучших вопросов и ответов на интервью по программированию на языке C (PDF)
  • Функция calloc() в библиотеке C с ПРИМЕРОМ программы

13) Функции в Си

Функция в C-программировании — это многократно используемый блок кода, который облегчает понимание, тестирование программы и может быть легко изменен без изменения вызывающей программы. Функции делят код и модулируют программу для лучшего и эффективного результата. Короче говоря, большая программа делится на различные подпрограммы, которые называются функциями

Функция в C

Когда вы разделяете большую программу на различные функции, становится легко управлять каждой функцией по отдельности. Всякий раз, когда в программе возникает ошибка, вы можете легко исследовать неисправные функции и исправлять только эти ошибки. Вы можете легко вызывать и использовать функции всякий раз, когда они требуются, что автоматически приводит к экономии времени и места.

В этом уроке вы узнаете

  • Библиотека Vs. Пользовательские функции
  • Объявление функции
  • Определение функции
  • Вызов функции
  • Аргументы функции
  • Переменная сфера
  • Статические переменные
  • Рекурсивные функции
  • Встроенные функции

Библиотека Vs. Пользовательские функции

Каждая программа «C» имеет по крайней мере одну функцию, которая является основной, но программа может иметь любое количество функций. Функция main () является отправной точкой программы.

В программировании «С» функции делятся на два типа:

  1. Библиотечные функции
  2. Пользовательские функции

Разница между библиотекой и пользовательскими функциями заключается в том, что нам не нужно писать код для библиотечной функции. Он уже присутствует в заголовочном файле, который мы всегда включаем в начало программы. Вам просто нужно ввести имя функции и использовать его вместе с правильным синтаксисом. Printf, scanf являются примерами библиотечной функции.

Принимая во внимание, что пользовательская функция — это тип функции, в которой мы должны написать тело функции и вызывать функцию всякий раз, когда нам требуется, чтобы функция выполняла какую-то операцию в нашей программе.

Пользовательская функция всегда пишется пользователем, но позже она может быть частью библиотеки ‘C’. Это главное преимущество программирования на «С».

В «С» функции программирования делятся на три вида деятельности, такие как:

  1. Объявление функции
  2. Определение функции
  3. Вызов функции

Объявление функции

Объявление функции означает написание имени программы. Это обязательная часть для использования функций в коде. В объявлении функции мы просто указываем имя функции, которую мы собираемся использовать в нашей программе как объявление переменной. Мы не можем использовать функцию, если она не объявлена ​​в программе. Объявление функции также называется « Прототип функции ».

Объявления функций (называемые прототипом) обычно выполняются над функцией main () и имеют общий вид:

return_data_type function_name (data_type arguments);
  • Return_data_type : это тип данных значения функции вернулась обратно в вызывающем заявлении.
  • Имя_функции : следуют круглые скобки
  • Имена аргументов с их объявлениями типов данных могут быть заключены в круглые скобки.

Рассмотрим следующую программу, которая показывает, как объявить функцию куба для вычисления значения куба целочисленной переменной

#include /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() 

Имейте в виду, что функция не обязательно возвращает значение. В этом случае используется ключевое слово void.

Например, объявление функции output_message указывает, что функция не возвращает значение: void output_message ();

Определение функции

Определение функции означает просто написание тела функции. Тело функции состоит из операторов, которые собираются выполнить определенную задачу. Тело функции состоит из одного или блока операторов. Это также обязательная часть функции.

int add(int a,int b) //function body

Вызов функции

Вызов функции означает вызов функции всякий раз, когда это требуется в программе. Всякий раз, когда мы вызываем функцию, она выполняет операцию, для которой она была разработана. Вызов функции является необязательной частью в программе.

result = add(4,5);

#include 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

Addition:30

Аргументы функции

Аргументы функции используются для получения необходимых значений при вызове функции. Они соответствуют позиции; первый аргумент передается первому параметру, второй — второму параметру и так далее.

По умолчанию аргументы передаются по значению, в котором копия данных передается вызываемой функции. Фактически переданная переменная не изменится.

Мы рассмотрим следующую программу, которая демонстрирует параметры, передаваемые по значению:

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)

5 + 10 = 15

Имейте в виду, что значения a и b, переданные функции add, не изменились, поскольку в параметр x было передано только его значение.

Переменная сфера

Область видимости переменных означает видимость переменных в коде программы.

В C переменные, которые объявлены внутри функции, являются локальными по отношению к этому блоку кода и не могут быть указаны вне функции. Однако переменные, которые объявлены вне всех функций, являются глобальными и доступны из всей программы. Константы, объявленные с помощью #define вверху программы, доступны из всей программы. Рассмотрим следующую программу, которая печатает значение глобальной переменной из основной и пользовательской функций:

#include int global = 1348; void test(); int main() < printf("from the main function : global =%d \n", global); test () ; return 0;>void test ()

from the main function : global =1348 from user defined function : global =1348

Обсуждаем детали программы:

  1. Мы объявляем целочисленную глобальную переменную с 1348 в качестве начального значения.
  2. Мы объявляем и определяем функцию test (), которая не принимает аргументы и не возвращает значение. Эта функция печатает только значение глобальной переменной, чтобы продемонстрировать, что к глобальным переменным можно получить доступ в любом месте программы.
  3. Мы печатаем глобальную переменную внутри главной функции.
  4. Мы вызываем тестовую функцию в orde для вывода значения глобальной переменной.

В C, когда аргументы передаются в параметры функции, параметры действуют как локальные переменные, которые будут уничтожены при выходе из функции.

Когда вы используете глобальные переменные, используйте их с осторожностью, потому что это может привести к ошибкам, и они могут измениться в любом месте программы. Они должны быть инициализированы перед использованием.

Статические переменные

Статические переменные имеют локальную область видимости. Однако они не уничтожаются при выходе из функции. Следовательно, статическая переменная сохраняет свое значение навсегда и может быть доступна при повторном вводе функции. Статическая переменная инициализируется при объявлении и требует префикса static.

Следующая программа использует статическую переменную:

#include void say_hi(); int main() < int i; for (i = 0; i < 5; i++) < say_hi();>return 0;> void say_hi()

Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5

Рекурсивные функции

Рассмотрим факториал числа, который рассчитывается следующим образом 6! = 6 * 5 * 4 * 3 * 2 * 1.

Этот расчет выполняется как многократный расчет факта * (факт -1), пока факт не станет равен 1.

Рекурсивная функция — это функция, которая вызывает себя и включает условие выхода для завершения рекурсивных вызовов. В случае вычисления факториального числа условие выхода равно 1. Фактически рекурсия работает путем «суммирования» вызовов до тех пор, пока условие выхода не станет истинным.

#include 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)); >
The factorial of 6 is 720

Здесь мы обсуждаем детали программы:

  1. Мы объявляем нашу рекурсивную факториальную функцию, которая принимает целочисленный параметр и возвращает факториал этого параметра. Эта функция будет вызывать сама себя и уменьшать число до выхода или до достижения базового условия. Когда условие истинно, ранее сгенерированные значения будут умножены друг на друга, и будет возвращено окончательное факториальное значение.
  2. Мы объявляем и инициализируем целочисленную переменную со значением «6», а затем печатаем ее факториальное значение, вызывая нашу факториальную функцию.

Рассмотрим следующую таблицу, чтобы лучше понять рекурсивный механизм, который состоит в том, чтобы вызывать саму функцию, пока не будет достигнут базовый случай или условие остановки, и после этого мы собираем предыдущие значения:

Встроенные функции

Функции используются для хранения наиболее часто используемых инструкций. Он используется для модуляции программы.

Всякий раз, когда вызывается функция, указатель инструкции переходит к определению функции. После выполнения функции указатель инструкции возвращается к оператору, с которого он перешел к определению функции.

Всякий раз, когда мы используем функции, нам требуется дополнительная головка указателя, чтобы перейти к определению функции и вернуться к выражению. Чтобы исключить необходимость использования таких указателей, мы используем встроенные функции.

Во встроенной функции вызов функции напрямую заменяется реальным программным кодом. Он не перепрыгивает ни на один блок, потому что все операции выполняются внутри встроенной функции.

Встроенные функции в основном используются для небольших вычислений. Они не подходят для больших вычислений.

Встроенная функция похожа на обычную функцию, за исключением того, что ключевое слово inline помещается перед именем функции. Встроенные функции создаются со следующим синтаксисом:

inline function_name () < //function definition >

Давайте напишем программу для реализации встроенной функции.

inline int add(int a, int b) //inline function declaration < return(a+b); >int main()

Addition: 30

Выше программа демонстрирует использование встроенной функции для сложения двух чисел. Как мы видим, мы вернули сложение по двум числам внутри встроенной функции только без написания лишних строк. Во время вызова функции мы только что передали значения, по которым мы должны выполнить сложение.

Резюме

  • Функция — это мини-программа или подпрограмма.
  • Функции используются для модульной программы.
  • Библиотека и определяемые пользователем два типа функций.
  • Функция состоит из объявления, тела функции и части вызова функции.
  • Объявление функции и тело являются обязательными.
  • Вызов функции может быть необязательным в программе.
  • С программа имеет хотя бы одну функцию; это основная функция ().
  • Каждая функция имеет имя, тип данных возвращаемого значения или void, параметры.
  • Каждая функция должна быть определена и объявлена ​​в вашей C-программе.
  • Имейте в виду, что обычные переменные в функции C уничтожаются, как только мы завершаем вызов функции.
  • Аргументы, передаваемые в функцию, не будут изменены, поскольку они передаются по значению none по адресу.
  • Область видимости переменной называется видимостью переменных в программе
  • В программировании на С есть глобальные и локальные переменные

Объявление и вызов функций

Мы начинаем большую и ключевую тему языка Си, посвященную функциям. До сих пор у нас в программах объявлялась только одна функция с именем main, из которой вызывались другие стандартные функции:

#include int main(void) { int x; if(scanf("%d", &x) == 1) puts("Correct input!"); else puts("Incorrect input!"); return 0; }

Спрашивается, что же такое функции и зачем они нужны? Вы уже знаете, что функция выполняет набор операторов, заключенных в ней. Благодаря этому в них можно выносить многократно повторяющиеся фрагменты кода, и, затем, вызывать функции в нужных местах программы. Например, код вывода строк в стандартный поток целесообразно вынести в отдельную функцию, т.к. эта операция довольно часто повторяется. В нашем примере, как раз, фигурирует два вызова функции puts(). В результате исключается дублирование кода, который в программировании кратко называется:

DRY – Don’t Repeat Yourself

Вообще, как только в программе появляется повторение (дублирование) кода, то, скорее всего, архитектура и структура программы выстроена неверно и ее следует пересмотреть. Дублирование – это очень грубая ошибка при проектировании программ. И функции, как раз, один из самых действенных методов этого избежать. В результате программа становится более модульной, проще воспринимается и редактируется.

Объявление и вызов функций

Конечно, стандартных функций, поставляемых с компилятором языка Си, недостаточно. Они покрывают лишь базовые потребности. Но мы легко можем объявить свои собственные и использовать их в своих программах. Общий синтаксис объявления функции имеет следующий вид:

Здесь первая строчка соответствует заголовку функции, а операторные фигурные скобки – телу функции. Тип данных перед именем функции определяет возвращаемый функцией тип значений. В самом простом случае это могут быть базовые типы:

int, char, double, short, .

Если же функция ничего не возвращает, то перед ней прописывается тип:

Имя функции придумывается самим программистом, подобно именам переменных. Но, если переменные, как правило, определяются существительными, то имена функций рекомендуется задавать глаголами, так как они связаны с определенными действиями. Например:

get_coord, show_x, is_digit, и т.п.

После имени функции обязательно должны идти круглые скобки, в которых могут быть указаны параметры функции. Что такое параметры и зачем они нужны, мы подробнее разберем позже. А здесь отмечу, что если функция не принимает никаких параметров, то принято при ее объявлении в круглых скобках прописывать ключевое слово void. Тем самым мы подчеркиваем факт отсутствия параметров.

После определения заголовка функции, с новой строки записывается открывающаяся фигурная скобка. Обратите внимание, с новой строки, а не на текущей! Это общепринятая запись оформления функций на языке Си. Фигурные скобки тела функции пишутся в отдельных строчках. Почему так? Потому что заголовок функции – это отдельная синтаксическая конструкция, которая может быть определена без тела функции. Об этом мы с вами еще будем говорить.

Давайте в качестве примера объявим функцию, которая выводит приветственное сообщение:

#include void print_hi(void) { puts("Hello! I'm Sergey Balakirev!"); } int main(void) { return 0; }

Здесь имя функции print_hi мы придумываем сами, возвращаемый тип void, т.к. функция ничего не возвращает. В качестве аргументов также указано ключевое слово void. Это простейший пример объявления функции в программе.

Обратите внимание, функция print_hi() объявлена до функции main(), после директив (если они присутствуют) и вне каких-либо других функций. То есть, прежде чем использовать какую-либо функцию, она должна быть прежде объявлена. Также как и с переменными: мы можем их использовать только после объявления.

Итак, если сейчас запустить программу, то никакого вывода на экран не увидим. Почему? Потому что функция всего лишь объявлена, но нигде не была вызвана (не запущена). Давайте сделаем вызов нашей функции в main() следующим образом:

int main(void) { print_hi(); return 0; }

Обратите внимание на круглые скобки после имени функции print_hi. Это операция вызова функции. Если их убрать, то программа выполнится, но функция print_hi() запущена не будет. Круглые скобки строго обязательны для запуска функции.

Если прописать еще два вызова этой же функции:

int main(void) { print_hi(); print_hi(); print_hi(); return 0; }

то при выполнении программы увидим три строчки приветствия:

Hello! I'm Sergey Balakirev!
Hello! I'm Sergey Balakirev!
Hello! I'm Sergey Balakirev!

Этот пример показывает, что мы можем многократно вызывать функции в любом месте программы и выполнять операторы, записанные в теле вызываемой функции.

Объявление и вызов функций с параметрами

Приведенная функция print_hi(), по большому счету, бесполезна. Она не дает нам ничего существенно нового. И это не удивительно, так как она ничего не принимает и ничего не возвращает. Давайте усложним пример и объявим функцию для вычисления периметра прямоугольника. Что нам для этого нужно? Очевидно, функция должна иметь информацию о длине и ширине прямоугольника, иначе периметр не вычислить. И, кроме того, должна вернуть вычисленное значение, чтобы мы его могли использовать дальше по программе.

Пусть функция называется get_per, а ширина и длина прямоугольника определяются целочисленными переменными:

int width, int height

Тогда объявить эту функцию можно следующим образом:

int get_per(int width, int height) { int p = 2 * (width + height); return p; }

Обратите внимание, параметры функции записываются как переменные через запятую. Собственно, это и есть обычные переменные. Причем, перед каждым параметром обязательно нужно указывать тип данных, даже при одинаковых типах. Объявление вида:

int get_per(int width, height) // ошибка

будет неверным. Хотя, при объявлении нескольких целочисленных переменных в теле функции мы можем использовать такой синтаксис. Но не при описании параметров.

Возвращаемый тип здесь также указан как int, так как функция возвращает целочисленное значение периметра прямоугольника. Сам периметр вычисляется в теле функции и сохраняется во временную переменную p. Затем, с помощью оператора return мы указываем, что именно будет возвращать данная функция. Так как нужно вернуть периметр, то записываем переменную p после ключевого слова return.

Кстати, тело функции в данном случае можно было бы записать в одну строчку, не создавая промежуточную переменную p:

int get_per(int width, int height) { return 2 * (width + height); }

Результат будет абсолютно таким же. Мало того, современные компиляторы обе функции преобразуют в машинные коды одинаковым образом. Поэтому какой вид записи использовать, решать только вам. Главное, чтобы программа была понятной для восприятия.

Забегая вперед отмечу, что все обычные параметры и переменные, объявленные внутри функции, создаются в момент вызова этой функции и исчезают при ее завершении. То есть, параметры width, height и переменная p доступны только внутри функции get_per() и не существуют за ее пределами. Более подробно мы с вами об этом еще будем говорить.

Давайте теперь посмотрим, на способы вызова функции get_per():

int main(void) { int w = 2, h = 5; get_per(w, h); int per_1 = get_per(w+1, h-4); int per_2 = get_per(w, 3); int per_3 = get_per(1, 3); return 0; }

Смотрите, в первом случае мы вызвали get_per(w, h) и не сохраняли возвращаемое ею значение. Так вполне можно делать, если не важно, что именно при вызове вернет функция. В этом случае говорят, что функция была вызвана ради побочного эффекта. То есть, не ради того, чтобы получить возвращаемое значение, а только ради выполнения операторов тела функции. Например, так часто поступают при вызове функции printf():

printf("get_per\n");

Она возвращает число байт, помещенных в выходной поток stdout, но нас это значение не интересует, так как обычно с выводом данных проблем не возникает.

Если же возвращаемое значение важно, то его можно сохранить с помощью операции присваивания в переменной соответствующего типа.

Далее, при каждом вызове функции get_per() в круглых скобках указываются значения, которые ей передаются. Эти значения называются аргументами и их должно быть ровно столько, сколько прописано параметров при объявлении функции. Каждое переданное значение копируется в соответствующий параметр: первый аргумент копируется в параметр width, а второй – в параметр height. Обратите внимание, данные именно копируются, то есть, создается их копия в переменных функции width и height. Соответственно, при первом вызове get_per() в параметры width и height записываются значения 2 и 5; при втором – значения 2+1 = 3 и 5-4 = 1; при третьем – 2 и 3; при четвертом – 1 и 3.

Если в момент вызова функции get_per() указать неверное число аргументов, например:

int per_3 = get_per(1);

то при компиляции возникнет ошибка. Число аргументов в нашем примере должно совпадать с числом параметров функции.

На этом мы завершим наше первое знакомство с функциями. Из этого занятия вы должны хорошо себе представлять, как объявляются и вызываются функции.

Видео по теме

Язык Си. Рождение легенды

#1. Этапы трансляции программы в машинный код. Стандарты

#2. Установка компилятора gcc и Visual Studio Code на ОС Windows

#3. Структура и понимание работы программы "Hello, World!"

#4. Двоичная, шестнадцатеричная и восьмеричная системы счисления

#5. Переменные и их базовые типы. Модификаторы unsigned и signed

#6. Операция присваивания. Числовые и символьные литералы. Операция sizeof

#7. Стандартные потоки ввода/вывода. Функции putchar() и getchar()

#8. Функция printf() для форматированного вывода

#9. Функция scanf() для форматированного ввода

#10. Арифметические операции: сложение, вычитание, умножение и деление

#11. Арифметические операции деления по модулю, инкремента и декремента

#12. Арифметические операции +=, -=, *=, /=, %=

#13. Булевый тип. Операции сравнения. Логические И, ИЛИ, НЕ

#14. Условный оператор if. Конструкция if-else

#15. Условное тернарное выражение

#16. Оператор switch множественного выбора. Ключевое слово break

#17. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операции

#18. Генерация псевдослучайных чисел. Функции математической библиотеки

#19. Директивы макропроцессора #define и #undef

#20. Директива #define для определения макросов-функций. Операции # и ##

#21. Директивы #include и условной компиляции

#22. Оператор цикла while

#23. Оператор цикла for

#24. Цикл do-while с постусловием. Вложенные циклы

#25. Операторы break, continue и goto

#26. Указатели. Проще простого

#27. Указатели. Приведение типов. Константа NULL

#28. Долгожданная адресная арифметика

#29. Введение в массивы

#30. Вычисление размера массива. Инициализация массивов

#31. Указатели на массивы

#32. Ключевое слово const с указателями и переменными

#33. Операции с массивами копирование, вставка, удаление и сортировка

#34. Двумерные и многомерные массивы. Указатели на двумерные массивы

#35. Строки. Способы объявления, escape-последовательности

#36. Ввод/вывод строк в стандартные потоки

#37. Строковые функции strlen(), strcpy(), strncpy(), strcat(), strncat()

#38. Строковые функции сравнения, поиска символов и фрагментов

#39. Строковые функции sprintf(), atoi(), atol(), atoll() и atof()

#40. Объявление и вызов функций

#41. Оператор return. Вызов функций в аргументах

#42. Прототипы функций

#43. Указатели как параметры. Передача массивов в функции

#44. Указатели на функцию. Функция как параметр (callback)

#45. Стековый фрейм. Автоматические переменные

#46. Рекурсивные функции

#47. Функции с произвольным числом параметров

#48. Локальные и глобальные переменные

#49. Локальные во вложенных блоках

#50. Ключевые слова static и extern

#51. Функции malloc(), free(), calloc(), realloc(), memcpy() и memmove()

#52. Перечисления (enum). Директива typedef

#53. Структуры. Вложенные структуры

#54. Указатели на структуры. Передача структур в функции

#55. Реализация стека (пример использования структур)

#56. Объединения (union). Битовые поля

#57. Файловые функции: fopen(), fclose(), fgetc(), fputc()

#58. Функции perror(), fseek() и ftell()

#59. Функции fputs(), fgets() и fprintf(), fscanf()

#60. Функции feof(), fflush(), setvbuf()

#61. Бинарный режим доступа. Функции fwrite() и fread()

#1. Первая программа на С++

#2. Ввод-вывод с помощью объектов cin и cout

#3. Пространства имен (namespace)

#4. Оператор using

#5. Новые типы данных. Приведение типов указателей

#6. Инициализация переменных. Ключевые слова auto и decltype

#7. Ссылки. Константные ссылки

#8. Объект-строка string. Операции с объектами класса string

#9. Файловые потоки. Открытие и закрытие файлов. Режимы доступа

#10. Чтение и запись данных в файл в текстовом режиме

#11. Чтение и запись данных в файл в бинарном режиме

#12. Перегрузка функций. Директива extern C

#13. Значения параметров функции по умолчанию

#15. Лямбда-выражения. Объявление и вызов

#16. Захват внешних значений в лямбда выражениях

#17. Структуры в С++, как обновленный тип данных

#18. Структуры. Режимы доступа. Сеттеры и геттеры

#19. Структуры. Конструкторы и деструкторы

#20. Операторы new / delete и new [] / delete []

© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *