Параметр (программирование)
Пара́метр в программировании — принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в каком качестве функция применила это принятое. То есть вызывающий код передает аргумент в параметр, который определен в члене спецификации функции.
Содержание
Формальные и фактические параметры
Важно различать:
- формальный параметр — аргумент, указываемый при объявлении или определении функции.[1][2]
- фактический параметр — аргумент, передаваемый в функцию при её вызове;
Пример на языке Си:
// Описание функции. int a - формальный параметр, имя параметра может отсутствовать.
int myfunction(int a);
// Определение функции. int b - формальный параметр, имя параметра может не совпадать с указанным при объявлении функции.
int myfunction(int b)
{
return 0;
}
int main()
{
int c=0;
myfunction(c); // Вызов функции. c - фактический параметр.
return 0;
}
Использование параметров
Семантика использования формальных и фактических параметров называется стратегией вычисления. Заданная стратегия вычисления диктует, когда следует вычислять аргументы функции (метода, операции, отношения), и какие значения следует передавать. Существует довольно много разнообразных стратегий вычисления.
Примечание — использование распространённого в сообществе императивного программирования термина «передача параметра» для многих языков программирования является не вполне корректным — например, в случае вызова по необходимости, применяемого в языке Haskell, параметр может быть использован в теле функции, но ни разу не передан за все случаи её вызова, и даже полностью исключён из результирующего машинного кода.
Наиболее часто упоминаемыми стратегиями вычисления являются вызов по значению и вызов по ссылке, однако в действительности использование этих терминов не всегда уместно. Например, в сообществе языка Java говорят «Java использует вызов по значению, где „значением“ является ссылка на объект», в сообществе языка Ruby говорят «Ruby использует вызов по ссылке», однако в действительности оба эти языка используют стратегию вызов по соиспользованию (англ. call-by-sharing)[3][4]. Многие языки, например Си, не имеют механизма вызова по ссылке, но позволяют симулировать его внутри семантики вызова по значению посредством ссылочных типов, в частности, указателей. В последнем случае в сообществах таких языков часто говорят «язык поддерживает две стратегии вычисления», а также о «вызове по указателю» или «вызове по адресу».
На практике, модель вычисления многих промышленных языков (Java, C#) сводится к стратегии «вызов-при-упоминании/передача-по-ссылке». Некоторые более старые языки, в особенности небезопасные языки, такие как C++, сочетают несколько разных моделей вызова, включая экзотичные, такие как «вызов-по-ссылке-на-константу». Исторически вызов по значению и вызов по имени восходят к Алголу-60, созданному в конце 1950-х годов. Только чистые функциональные языки, такие как Clean и Haskell, используют вызов по необходимости (англ. call-by-need), который часто отождествляют (что также не вполне корректно) с ленивыми вычислениями.
Примеры
Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной (как в случае передачи параметра по адресу), однако синтаксис используется такой, чтобы программисту не приходилось использовать операцию разыменования и он мог иметь дело непосредственно со значением, хранящимся по этому адресу (как в случае передачи параметра по значению).
Передача по ссылке позволяет избежать копирования всей информации, описывающей состояние объекта (а это может быть существенно больше чем sizeof(int)) и является необходимой для конструктора копирования.
Если функция возвращает значение по ссылке (например, в виде «return *this;»), то её вызов можно использовать слева от оператора присваивания (смотри также L-выражение).
В случае, если передача по ссылке используется именно как средство увеличения быстродействия, но изменение параметра нежелательно, можно использовать передачу по ссылке константного объекта.
#include <iostream>
using namespace std; // для использования cout
void f(int x)
{
// передача параметра по значению
cout << x;
x = 1;
cout << x;
}
void g(int* x)
{
// передача параметра по адресу
cout << *x;
*x = 2;
cout << *x;
}
void h(int& x)
{
// передача параметра по ссылке
cout << x;
x = 3;
cout << x;
}
void i(const int& x)
{
// передача неизменяемого параметра по ссылке
cout << x;
x = 4; //Ошибка из-за которой код не будет скомпилирован
cout << x;
}
int main()
{
int x = 0;
cout << x;
f(x);
cout<< x << " ";
g(&x);
cout << x << " ";
h(x);
cout << x << " ";
i(x);
cout << x;
return 0;
}
Таким образом можно ожидать, что примерная программа напечатает (если закомментировать ошибочную строку) «0010 022 233 333».
Некоторые языки (или их диалекты) не поддерживают передачу по ссылке, некоторые наоборот — передают параметры исключительно по ссылке, что порождает риск непреднамеренного изменения контекста вызывающей функции.
Язык Fortran подразумевает передачу параметров исключительно по ссылке:
Программа:
PROGRAM PARAMS
IMPLICIT NONE
INTEGER A, B, C
A = 7.0
B = 9.0
C = 0.0
100 FORMAT('A =',I2,', B =',I2,', C =',I3)
WRITE(*, 100) A, B, C
CALL MUL(A, B, C)
WRITE(*, 100) A, B, C
END PROGRAM
SUBROUTINE MUL(A, B, C)
INTEGER A, B, C
C = A * B
END SUBROUTINE
Напечатает:
A = 7, B = 9, C = 0
A = 7, B = 9, C = 63
См. также
Напишите отзыв о статье "Параметр (программирование)"
Литература
- В.В.Фаронов. 8.2.2. Параметры // 8.2. Описание подпрограммы // Глава 8. Процедуры и функции // [borlpasc.narod.ru/docym/Faronov/gl8/gl8_3.html Иллюстрированный самоучитель по Турбо Паскалю].
Ссылки
- ↑ [crasseux.com/books/ctutorial/Actual-parameters-and-formal-parameters.html The GNU C Programming - Actual parameters and formal parameters] (англ.).
- ↑ [citforum.ru/programming/c/h15.shtml Определение и вызов функций].
- ↑ Fredrik Lundh. [effbot.org/zone/call-by-object.htm Call By Object] ( (англ.)). effbot.org.
- ↑ [www.cs.cornell.edu/courses/cs412/2001sp/iota/iota.html Iota Language Definition]. CS 412/413 Introduction to Compilers. Cornell University (2001).
<imagemap>: неверное или отсутствующее изображение |
Для улучшения этой статьи желательно?:
|
Отрывок, характеризующий Параметр (программирование)
– Душой рада, что приехали и что у меня остановились, – говорила она. – Давно пора, – сказала она, значительно взглянув на Наташу… – старик здесь и сына ждут со дня на день. Надо, надо с ним познакомиться. Ну да об этом после поговорим, – прибавила она, оглянув Соню взглядом, показывавшим, что она при ней не желает говорить об этом. – Теперь слушай, – обратилась она к графу, – завтра что же тебе надо? За кем пошлешь? Шиншина? – она загнула один палец; – плаксу Анну Михайловну? – два. Она здесь с сыном. Женится сын то! Потом Безухова чтоль? И он здесь с женой. Он от нее убежал, а она за ним прискакала. Он обедал у меня в середу. Ну, а их – она указала на барышень – завтра свожу к Иверской, а потом и к Обер Шельме заедем. Ведь, небось, всё новое делать будете? С меня не берите, нынче рукава, вот что! Намедни княжна Ирина Васильевна молодая ко мне приехала: страх глядеть, точно два боченка на руки надела. Ведь нынче, что день – новая мода. Да у тебя то у самого какие дела? – обратилась она строго к графу.– Всё вдруг подошло, – отвечал граф. – Тряпки покупать, а тут еще покупатель на подмосковную и на дом. Уж ежели милость ваша будет, я времечко выберу, съезжу в Маринское на денек, вам девчат моих прикину.
– Хорошо, хорошо, у меня целы будут. У меня как в Опекунском совете. Я их и вывезу куда надо, и побраню, и поласкаю, – сказала Марья Дмитриевна, дотрогиваясь большой рукой до щеки любимицы и крестницы своей Наташи.
На другой день утром Марья Дмитриевна свозила барышень к Иверской и к m me Обер Шальме, которая так боялась Марьи Дмитриевны, что всегда в убыток уступала ей наряды, только бы поскорее выжить ее от себя. Марья Дмитриевна заказала почти всё приданое. Вернувшись она выгнала всех кроме Наташи из комнаты и подозвала свою любимицу к своему креслу.
– Ну теперь поговорим. Поздравляю тебя с женишком. Подцепила молодца! Я рада за тебя; и его с таких лет знаю (она указала на аршин от земли). – Наташа радостно краснела. – Я его люблю и всю семью его. Теперь слушай. Ты ведь знаешь, старик князь Николай очень не желал, чтоб сын женился. Нравный старик! Оно, разумеется, князь Андрей не дитя, и без него обойдется, да против воли в семью входить нехорошо. Надо мирно, любовно. Ты умница, сумеешь обойтись как надо. Ты добренько и умненько обойдись. Вот всё и хорошо будет.
Наташа молчала, как думала Марья Дмитриевна от застенчивости, но в сущности Наташе было неприятно, что вмешивались в ее дело любви князя Андрея, которое представлялось ей таким особенным от всех людских дел, что никто, по ее понятиям, не мог понимать его. Она любила и знала одного князя Андрея, он любил ее и должен был приехать на днях и взять ее. Больше ей ничего не нужно было.
– Ты видишь ли, я его давно знаю, и Машеньку, твою золовку, люблю. Золовки – колотовки, ну а уж эта мухи не обидит. Она меня просила ее с тобой свести. Ты завтра с отцом к ней поедешь, да приласкайся хорошенько: ты моложе ее. Как твой то приедет, а уж ты и с сестрой и с отцом знакома, и тебя полюбили. Так или нет? Ведь лучше будет?
– Лучше, – неохотно отвечала Наташа.
На другой день, по совету Марьи Дмитриевны, граф Илья Андреич поехал с Наташей к князю Николаю Андреичу. Граф с невеселым духом собирался на этот визит: в душе ему было страшно. Последнее свидание во время ополчения, когда граф в ответ на свое приглашение к обеду выслушал горячий выговор за недоставление людей, было памятно графу Илье Андреичу. Наташа, одевшись в свое лучшее платье, была напротив в самом веселом расположении духа. «Не может быть, чтобы они не полюбили меня, думала она: меня все всегда любили. И я так готова сделать для них всё, что они пожелают, так готова полюбить его – за то, что он отец, а ее за то, что она сестра, что не за что им не полюбить меня!»
Они подъехали к старому, мрачному дому на Вздвиженке и вошли в сени.
– Ну, Господи благослови, – проговорил граф, полу шутя, полу серьезно; но Наташа заметила, что отец ее заторопился, входя в переднюю, и робко, тихо спросил, дома ли князь и княжна. После доклада о их приезде между прислугой князя произошло смятение. Лакей, побежавший докладывать о них, был остановлен другим лакеем в зале и они шептали о чем то. В залу выбежала горничная девушка, и торопливо тоже говорила что то, упоминая о княжне. Наконец один старый, с сердитым видом лакей вышел и доложил Ростовым, что князь принять не может, а княжна просит к себе. Первая навстречу гостям вышла m lle Bourienne. Она особенно учтиво встретила отца с дочерью и проводила их к княжне. Княжна с взволнованным, испуганным и покрытым красными пятнами лицом выбежала, тяжело ступая, навстречу к гостям, и тщетно пытаясь казаться свободной и радушной. Наташа с первого взгляда не понравилась княжне Марье. Она ей показалась слишком нарядной, легкомысленно веселой и тщеславной. Княжна Марья не знала, что прежде, чем она увидала свою будущую невестку, она уже была дурно расположена к ней по невольной зависти к ее красоте, молодости и счастию и по ревности к любви своего брата. Кроме этого непреодолимого чувства антипатии к ней, княжна Марья в эту минуту была взволнована еще тем, что при докладе о приезде Ростовых, князь закричал, что ему их не нужно, что пусть княжна Марья принимает, если хочет, а чтоб к нему их не пускали. Княжна Марья решилась принять Ростовых, но всякую минуту боялась, как бы князь не сделал какую нибудь выходку, так как он казался очень взволнованным приездом Ростовых.
– Ну вот, я вам, княжна милая, привез мою певунью, – сказал граф, расшаркиваясь и беспокойно оглядываясь, как будто он боялся, не взойдет ли старый князь. – Уж как я рад, что вы познакомились… Жаль, жаль, что князь всё нездоров, – и сказав еще несколько общих фраз он встал. – Ежели позволите, княжна, на четверть часика вам прикинуть мою Наташу, я бы съездил, тут два шага, на Собачью Площадку, к Анне Семеновне, и заеду за ней.
Илья Андреич придумал эту дипломатическую хитрость для того, чтобы дать простор будущей золовке объясниться с своей невесткой (как он сказал это после дочери) и еще для того, чтобы избежать возможности встречи с князем, которого он боялся. Он не сказал этого дочери, но Наташа поняла этот страх и беспокойство своего отца и почувствовала себя оскорбленною. Она покраснела за своего отца, еще более рассердилась за то, что покраснела и смелым, вызывающим взглядом, говорившим про то, что она никого не боится, взглянула на княжну. Княжна сказала графу, что очень рада и просит его только пробыть подольше у Анны Семеновны, и Илья Андреич уехал.
M lle Bourienne, несмотря на беспокойные, бросаемые на нее взгляды княжны Марьи, желавшей с глазу на глаз поговорить с Наташей, не выходила из комнаты и держала твердо разговор о московских удовольствиях и театрах. Наташа была оскорблена замешательством, происшедшим в передней, беспокойством своего отца и неестественным тоном княжны, которая – ей казалось – делала милость, принимая ее. И потом всё ей было неприятно. Княжна Марья ей не нравилась. Она казалась ей очень дурной собою, притворной и сухою. Наташа вдруг нравственно съёжилась и приняла невольно такой небрежный тон, который еще более отталкивал от нее княжну Марью. После пяти минут тяжелого, притворного разговора, послышались приближающиеся быстрые шаги в туфлях. Лицо княжны Марьи выразило испуг, дверь комнаты отворилась и вошел князь в белом колпаке и халате.