Функция (программирование)
Из Википедии, бесплатной энциклопедии
Фу́нкция в программировании, или подпрограмма — фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор[англ.], но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.
Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют процедурами. В некоторых языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.
Функция должна быть соответствующим образом объявлена и определена. Объявление функции, кроме имени, содержит список имён и типов передаваемых параметров (или: аргументов), а также, тип возвращаемого функцией значения. Определение функции содержит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение функции, в то время как в ряде других языков необходимо сначала объявить функцию, а уже потом привести её определение.
В объектно-ориентированном программировании функции, объявления которых являются неотъемлемой частью определения класса, называются методами. Также в языках с ООП возможно объявление абстрактной (виртуальной) функции без объявления тела функции.
Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного кода указать имя функции и перечислить передаваемые в функцию параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной, на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые происходят в теле функции с переменной, переданной по ссылке, происходят с самой переданной переменной.
Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.
Существует возможность вызвать функцию внутри самой функции: такой вызов функции называется рекурсивным, а сам процесс последовательных вложенных друг в друга вызовов функций называют рекурсией. Поскольку необходимо запомнить (в стеке) адрес возврата функции (а также, выделить в том же стеке память под параметры и локальные переменные, не являющиеся динамическими), то ничем не ограниченная рекурсия приводит к переполнению стека, поэтому в языках программирования устанавливается некоторый предельный уровень вложенности рекурсивных вызовов.
Примеры функций
[править | править код]JavaScript
[править | править код]function sum(a, b) { return a + b }
ActionScript
[править | править код]public function name(text: string) { var textfield: TextField = new TextField(); textfield.text = text; }
C++
[править | править код]void name(string text) { cout << text; }
в стандарте C++ существуют так же функции с аргументами по умолчанию
void foo(int arg1, int arg2 = 10) { cout << arg1 << arg2; } foo(9); // вызовется и будет выведено 910
Ruby
[править | править код]def greetings(name) puts "Hi #{name}" end greetings('Ksenia') #Hi Ksenia
Rust
[править | править код]#[inline(always)] fn max<T>(a: T, b: T) -> T where T: PartialOrd, { if a > b { a } else { b } } max(3, 5);
C#
[править | править код]public void Name(string text) { Console.WriteLine(text); }
Java
[править | править код]public void name(String text) { System.out.println(text); }
Pascal
[править | править код]procedure name(var text: string) begin write(text); end;
PHP
[править | править код]function name($text) { echo $text; }
Standard ML
[править | править код]fun name t = print t
или, что то же самое (см. функции первого класса и лямбда-функция):
val name = fn t => print t
Swift
[править | править код]func foo(arg1: Int, arg2: Int = 10) { print(arg1 * arg2) } foo(arg1: 9) // (9 * 10) Ответ: 90
Visual Basic
[править | править код]Sub Name(text) Console.WriteLine(text) End Sub
PureBasic
[править | править код]Procedure.l Name(text.s) PrintN(text) EndProcedure
Python
[править | править код]def func(p1: str, p2: int = 10): print(p1, p2) func(123) # 123 10
Nim
[править | править код]proc myfunc(text: string)= echo text
См. также
[править | править код]Ссылки
[править | править код]![]() | Для улучшения этой статьи по информационным технологиям желательно: |