Подпрограмма: различия между версиями

42 байта убрано ,  2 года назад
м
LintErrors
м (LintErrors)
Существует несколько способов передачи параметров в подпрограмму.
* '''Передача параметров по значению.''' Формальному параметру присваивается ''значение'' фактического параметра. В этом случае формальный параметр будет содержать копию значения, имеющегося в фактическом, и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических. Так, если в качестве фактического параметра будет использована переменная, и внутри подпрограммы значение соответствующего формального параметра будет изменено, то фактический параметр останется без изменений.
<blockquote><codesource>int func1(int x)
{
x=x+2;
return x;
}</source>
}</code></blockquote>
 
* '''Передача параметров по ссылке.''' В формальный параметр может быть помещён ''сам'' фактический параметр (обычно это реализуется путём помещения в формальный параметр [[Ссылка (программирование)|ссылки]] на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре — оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.
<blockquote><codesource>void func2(int &x)
{
x=x+2;
}</source>
}</code></blockquote>
* '''Передача параметров по имени.''' В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках [[Алгол]] или [[Алгол 68]].
* '''Передача параметров через стек.''' Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке [[Forth|Форт]].