Производительность различных локальных переменных в Паскале

У нас есть три программы с процедурой.

В 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 это изменит только локальную копию и не изменит переданную переменную

Другие вопросы по тегам