Производительность различных локальных переменных в Паскале
У нас есть три программы с процедурой.
В proc01:
output: a=22
В proc02:
output: a=16 b=2 c=5
В proc03:
output: a=5
proc01 и 03 одинаковы. За исключением того, что мы изменили параметры процедуры. Почему в proc01 добавлено значение d, а в proc03 нет.
Другой пример: proc02. Значение d не добавлено.
Зачем????
proc01:
program proc01;
var
a,b:integer;
procedure test01(var a:integer;b:integer);
var
d:integer;
Begin
d:=12;
a:=b+d;
End;
Begin
a:=5;
b:=10;
test01(a,b);
Writeln('a=',a);
Readln;
End.
proc02:
program proc02;
var
a,b,c:integer;
procedure test01(var b:integer; a:integer);
var
d:integer;
Begin
d:=12;
a:=b+d;
b:=a+c;
c:=c+2;
End;
Begin
a:=1;
b:=2;
c:=3;
test01(a,b);
Writeln('a=',a,' b=',b,' c=',c);
Readln;
End.
proc03:
program proc03;
var
a,b:integer;
procedure test01(var b:integer;a:integer);
var
d:integer;
Begin
d:=12;
a:=b+d;
End;
Begin
a:=5;
b:=10;
test01(a,b);
Writeln('a=',a);
Readln;
End.
2 ответа
Скорее всего потому, что в proc03 вы передаете значение "a" для переменной "b" и наоборот. Посмотрите на разницу в сигнатуре test01 в proc01 и proc03 ("a" и "b" расположены в разном порядке). Таким образом, в proc3 вы фактически вводите результат "b + d" в локальную переменную "a", но в переменную "b" программы переменная "a" программы не изменяется. Поэтому измените подпись test01 на
процедура test01(var a:integer, b: integer)
чтобы заставить это работать как ожидалось.
В общем, я бы не рекомендовал использовать точно такие же имена для переменных программы и процедур, чтобы избежать подобных ошибок.
Alex
В процессе 02 и 03 a
параметр передается по значению, а не по ссылке
Поэтому, когда вы назначаете любое значение a
это изменит только локальную копию и не изменит переданную переменную