Функция (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Ошибка скрипта: Модуля «hatnote» не существует.{{#if: | }}

Фу́нкция в программировании, или подпрограмма — фрагмент программного кода, к которому можно обратиться из другого места программы. В большинстве случаев с функцией Шаблон:Iw, но многие языки допускают и безымянные функции. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная функция была вызвана.

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

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

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

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

Функция определяет собственную (локальную) область видимости, куда входят входные параметры, а также те переменные, которые объявляются непосредственно в теле самой функции.

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

Примеры функций

JavaScript

<source lang="javascript"> function sum(a, b) {

 return a + b

} </source>

ActionScript

<source lang="actionscript"> public function name(text: string) {

       var textfield: TextField = new TextField();
       textfield.text = text;

} </source>

C++

<source lang="cpp"> void name(string text) {

   cout << text;

} </source>в стандарте C++ существуют так же функции с аргументами по умолчанию<syntaxhighlight lang="c++"> void foo(int arg1, int arg2 = 10) { cout << arg1 << arg2; }

foo(9); // вызовется и будет выведено 910 </syntaxhighlight>

Ruby

<syntaxhighlight lang="ruby"> def greetings(name)

   puts "Hi #{name}"

end

greetings('Ksenia') #Hi Ksenia </syntaxhighlight>

Rust

<source lang="rust">

  1. [inline(always)]

fn max<T>(a: T, b: T) -> T where

   T: PartialOrd,

{

   if a > b 
   {
       a
   }
   else 
   {
       b
   }

}

max(3, 5); </source>

C#

<source lang="csharp"> public void Name(string text) {

   Console.WriteLine(text);

} </source>

Java

<syntaxhighlight lang="java" line="1"> public void name(String text) {

   System.out.println(text);

} </syntaxhighlight>

Pascal

<source lang="pascal"> function name(var text: string): string; begin

 result = text;

end; </source>

PHP

<source lang="php"> function name($text) {

   echo $text;

} </source>

Standard ML

<source lang="ocaml"> fun name t = print t </source> или, что то же самое (см. функции первого класса и лямбда-функция): <source lang="ocaml"> val name = fn t => print t </source>

Swift

<syntaxhighlight lang="swift"> func foo(arg1: Int, arg2: Int = 10) {

   print(arg1 * arg2)

}

foo(arg1: 9) // (9 * 10) Ответ: 90 </syntaxhighlight>

Visual Basic

<source lang="vb"> Sub Name(text)

   Console.WriteLine(text)

End Sub </source>

PureBasic

<source lang="purebasic"> Procedure.l Name(text.s)

   PrintN(text)

EndProcedure </source>

Python

<source lang="python3"> def func(p1: str, p2: int = 10):

   print(p1, p2)

func(123) # 123 10 </source>

Nim

<syntaxhighlight lang="nim"> proc myfunc(text: string)=

 echo text

</syntaxhighlight>

См. также

Ссылки

Шаблон:Rq