#parameter-passing #pass-by-reference #pascal #semantics #pass-by-const-reference
#передача параметров #передача по ссылке #паскаль #семантика #передача по постоянной ссылке
Вопрос:
Итак, у меня есть этот фрагмент кода на Паскале:
program P;
var a: array [1..2] of Integer;
var i :Integer;
var k :Integer;
procedure update(x,y,z: Integer);
begin
x := x 1;
y := x*2;
x := y;
k := x;
end
begin
a[1] := 5; a[2] := 10;
k := 3;
for i:=1 to 2 do
begin
update(a[i],a[2],k);
print(a);
print(k)
end
end.
(предположим, что ‘print’ печатает элементы массива, разделенные пробелами, а затем печатает новую строку, а также для целого числа он просто печатает его)
И я пытаюсь понять, насколько отличался бы результат, если бы вызов функции выполнялся по значению-результату или по ссылке.
очевидно, что если бы это было просто по значению, легко сказать, что процедура не будет иметь никакого значения для фактического параметра, т.е. Вывод (по значению) должен быть: 5 10 3 5 10 3.
Я думаю, что если бы это было значение-результат, это было бы, по крайней мере, на первой итерации: 12 12 12. в случае с ссылкой я запутался. Что бы это было?
Комментарии:
1. Почему это помечено как C , а не как Pascal?
2. извините, я виноват, хотя на самом деле это не имеет значения, поскольку предмет вопроса не имеет ничего общего с языком, на котором он написан.
3. Вы включили код, так что теги абсолютно ничего не меняют.
4. Что происходит, когда вы пытаетесь это сделать? Если вы это сделаете, вы четко увидите разницу. (Кроме того, тег полностью актуален при публикации кода. Обычно рекомендуется обращать внимание на советы, которые вы получаете здесь, особенно когда они исходят от людей со значительным опытом работы здесь. Вы получите ответы намного быстрее, если пометите его в соответствии с языком опубликованного вами кода; люди, знакомые с этим языком, увидят его, и это актуально для будущих читателей этого сайта при поиске информации.)
5. Чтобы проиллюстрировать разницу, напишите свою
update
,
Ответ №1:
Вы не объявили никаких переменных параметров. Переменная K
будет изменена, но это не считается в данном контексте и обычно считается плохой практикой.
PROGRAM ParamTest;
VAR
A, B : Integer;
PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer);
BEGIN
X := X Z;
Y := Y Z;
END;
BEGIN
A := 10;
B := 10;
TestProc(A, B, 5);
WriteLn(A, ' ', B);
END.
- X: вызов по значению
- Y: вызов по ссылке
- Z: вызов по константе
Вывод этой программы должен быть 10 15
.
Объявляя Z
параметр как постоянный, вы обещаете компилятору, что не измените это значение. Следующий вариант процедуры должен выдавать ошибку при компиляции.
PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer);
BEGIN
X := X Z;
Y := Y Z;
Z := Z 1;
END;