Функция определяет действия, которые выполняет программа. Функции позволяют выделить набор инструкций и назначить ему имя. А затем многократно по присвоенному имени вызывать в различных частях программы. По сути функция — это именованный блок кода.
Формальное определение функции выглядит следующим образом:
тип имя_функции(параметры)
Первая строка представляет заголовок функции. Вначале указывается возвращаемый тип функции. Если функция не возвращает никакого значения, то используется тип void .
Затем идет имя функции, которое представляет произвольный идентификатор. К именованию функции применяются те же правила, что и к именованию переменных.
После имени функции в скобках идет перечисление параметров. Функция может не иметь параметров, в этом случае указываются пустые скобки.
После заголовка функции в фигурных скобках идет тело функции, которое содержит выполняемые инструкции.
Для возвращения результата функция применяет оператор return . Если функция имеет в качестве возвращаемого типа любой тип, кроме void, то она должна обязательно с помощью оператора return возвращать какое-либо значение.
C# ФУНКЦИИ И МЕТОДЫ | МЕТОД C# ЧТО ЭТО | ФУНКЦИИ C# ПРИМЕР | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | # 35
Например, определение функции main, которая должна быть в любой программе на языке C++ и с которой начинается ее выполнение:
int main()
Возвращаемым типом функции является тип int , поэтому функция должна использовать оператор return и возвращать какое-либо значение, которое соответствует типу int. Возвращаемое значение ставится после оператора return.
Стоит отметить, что С++ позволяет не использовать оператор return в функции main:
int main()
Но если функция имеет тип void , то ей не надо ничего возвращать. Например, мы могли бы определить следующую функцию, которая просто выводит некоторый текст на консоль:
void hello()
Выполнение функции
Когда запускается программа на языке C++, то запускается функция main. Никакие другие функции, определенные в программе, автоматически не выполняются. Для выполнения функции ее необходимо вызвать. Вызов функции осуществляется в форме:
имя_функции(аргументы);
После имени функции указываются скобки, в которых перечисляются аргументы — значения для параметров функции.
Например, определим и выполним простейшую функцию:
#include void hello() < std::cout int main()
Здесь определена функция hello, которая вызывается в функции main два раза. В этом и заключается преимущество функций: мы можем вынести некоторые общие действия в отдельную функцию и затем вызывать многократно в различных местах программы. В итоге программа два раза выведет строку «hello».
hello hello
Объявление функции
При использовании функций стоит учитывать, что компилятор должен знать о функции до ее вызова. Поэтому вызов функции должен происходить после ее определения, как в случае выше. В некоторых языках это не имеет значение, но в языке C++ это играет большую роль. И если, к примеру, мы сначала вызовем, а потом определим функцию, то мы получим ошибку на этапе компиляции, как в следующем случае:
Методы класса. Что такое методы в программировании. Вызов метода класса. Функции. C++ Урок #74
#include int main() < hello(); hello(); >void hello()
В этом случае перед вызовом функции надо ее дополнительно объявить. Объявление функции еще называют прототипом. Формальное объявление выглядит следующим образом:
тип имя_функции(параметры);
Фактически это заголовок функции. То есть для функции hello объявление будет выглядеть следующим образом:
void hello();
Используем объявление функции:
#include void hello(); int main() < hello(); hello(); >void hello()
В данном случае несмотря на то, что определение функции идет после ее вызова, но так как функция уже объявлена до ее вызова, то компилятор будет знать о функции hello, и никаких проблем в работе программы не возникнет.
Источник: metanit.com
Описание и вызов процедур и функций
Структура описания процедур и функций до некоторой степени похожа на структуру программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур. Формат описания процедуры имеет вид:
procedure имя процедуры(формальные параметры);
раздел описаний процедуры
исполняемая часть процедуры
Формат описания функции:
function имя функции(формальные параметры):тип результата;
раздел описаний функции
исполняемая часть функции
Формальные параметры в заголовке процедур и функций записываются в виде:
var имя праметра:имя типа
и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type. Список формальных параметров может отсутствовать.
Вызов процедуры производится оператором, имеющим следующий формат:
имя процедуры(список фактических параметров);
Список фактических параметров- это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке. Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.
Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того, имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.
Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок, необходимо поместить следующую команду:
имя функции:=результат;
При вызове процедур и функций необходимо соблюдать следующие правила:
- количество фактических параметров должно совпадать с количеством формальных;
- соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Локальные и глобальные переменные в Turbo Pascal.
- Описывать идентификаторы в том блоке, где они используются, если это возможно.
- Если один и тот же объект (переменная, тип, константа) используется в двух и более блоках, то описать этот объект надо в самом внешнем из них, содержащем все остальные блоки, использующие данный объект.
- Если переменная, используемая в процедуре, должна сохранить свое значение до следующего вызова этой процедуры, то такую переменную надо описать во внешнем блоке, содержащем данную процедуру.
Источник: studfile.net
Вызовы функций
Вызовом функции называется выражение, которое передает функции управление и аргументы (если они есть). Такие выражения имеют следующую форму:
где expression — это имя функции или выражение, результатом которого является адрес функции, а expression-list содержит список выражений, разделенных запятыми. Значения этих выражений являются аргументами, которые передаются функции. Если функция не возвращает значения, то при ее объявлении необходимо указать, что она возвращает тип void .
Если объявление указывается до вызова функции, однако информация о ее параметрах не приводится, то для любых необъявленных аргументов выполняются обычные арифметические преобразования.
Выражения в списке аргументов функции могут оцениваться в любом порядке, поэтому аргументы, значения которых могут изменяться в качестве побочного эффекта других аргументов, имеют неопределенные значения. Точка следования, определяемая оператором вызова функции, гарантирует только то, что все побочные эффекты в списке аргументов будут оценены до того, как управление будет передано вызванной функции. (Обратите внимание, что порядок, в котором аргументы отправляются в стек, — это отдельная тема.) Дополнительные сведения см. в разделе Точки следования.
Единственное требование к любому вызову функции заключается в том, что выражение перед скобками должно иметь своим результатом адрес функции. Это означает, что функцию можно вызвать любым выражением, значением которого является указатель функции.
Пример
В следующем примере представлен вызов функций, совершаемый из оператора switch :
int main() < /* Function prototypes */ long lift( int ), step( int ), drop( int ); void work( int number, long (*function)(int i) ); int select, count; . . . select = 1; switch( select ) < case 1: work( count, lift ); break; case 2: work( count, step ); break; case 3: work( count, drop ); /* Fall through to next case */ default: break; >> /* Function definition */ void work( int number, long (*function)(int i) )
В этом примере вызов функции располагается в функции main :
work( count, lift );
Он передает функции count целочисленную переменную lift , а также адрес функции work . Обратите внимание, что адрес функции передается просто в виде идентификатора функции, поскольку он равен выражению указателя. Чтобы идентификатор функции можно было использовать таким образом, функцию необходимо объявить и определить до того, как будет использован идентификатор; в противном случае идентификатор не будет распознан. В этом случае прототип функции work задан в начале функции main .
Параметр function в функции work объявлен как указатель на функцию, принимающую один аргумент типа int и возвращающую значение типа long . Скобки вокруг имени параметра являются обязательными. Без них это объявление будет означать, что функция возвращает указатель на значение типа long .
Функция work вызывает выбранную функцию из цикла for , используя следующий вызов:
( *function )( i );
Вызываемой функции передается один аргумент, i :
Источник: learn.microsoft.com