Если в качестве формального параметра указана переменная, то такой параметр и есть параметр-значение. Примерами таких параметров служат параметры a, b и с в процедуре sq:
procedure sq((a, b, c: real; var x1, x2: real);
В этом случае фактическим параметром, соответствующим a либо b либо c, может быть любое выражение соответствующего типа, в частности, константа.
Например, обратиться к sq можно так:
sq((25./3 + 2) * 2, -1.5, (8.2 – 3.1) / 3, x1, x2);
Для параметров-значений машина при вызове процедур производит следующие действия: выделяет место в памяти для каждого формального параметра, вычисляет значение фактического параметра и записывает его в ячейку, соответствующую формальному параметру.
Если фактический параметр есть имя переменной, например, r, то значение этой переменной пересылается в соответствующий формальный параметр, например, a. На этом всякая связь между a и r обрывается.
Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение.
Пример.
var i: integer; procedure p(i: integer); begin i := i * 2 end; begin i := 2; p(i); writeln(' i = ', i); readln end.
В программе происходит засылка числа 2 в ячейку, отведенную для переменнойi, затем идет обращение к процедуре p с фактическим параметром i = 2. При этом значение 2 пересылается в другую ячейку, отведенную для формального параметраi. В этой ячейке после выполнения оператора i := i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа "знает" только одну переменную i, которая по-прежнему содержит число 2. Поэтому программа выведет i = 2.
Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.