Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите с задачей

Автор: -Eni- 26.11.2007 20:59

вот такой код

Код

var  a:integer;

function f(x:integer):integer;
begin
  f:=x;
  x:=6;
end;

begin
  a:=1;
  writeln('Ответ = ',f(a)-f(a));
end.  


Имхо сдесь получается так - Ответ = -5 НО!!!! после выполнения на экране появляется иное Ответ = 5....
=)
помагите чем могите )

 ! 
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...


Автор: Гость 26.11.2007 21:09

сорри у функции вар забыл )

 
var a:integer;

function f(var x:integer):integer;
begin
f:=x;
x:=6;
end;

begin
a:=1;
writeln('Ответ = ',f(a)-f(a));
end.


Автор: -Eni- 26.11.2007 21:26

да и это все в на паскале.. потому как на в среде программирования делфи все ответ именно -5

Автор: -Eni- 26.11.2007 21:33

Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца.... cool.gif
Осталось доказать теперь это... wacko.gif

Автор: -Eni- 26.11.2007 21:51

в общем получилось так
Сначала вычисляется значение f(a) = 1 и помещается в стек, потом опять береться значение и помещается так же в этот же стек оно равно 6.. а дальше ) все как по маслу.. подставляется первое значение из стека, а потом второе... то есть получается такая фиговина - writeln('Ответ = ', 6 - 1);
откуда и выходит пятерочка, а не минус пятерачка )))) cool.gif

всем спасибо smile.gif

Автор: Malice 26.11.2007 21:56

Цитата(-Eni- @ 26.11.2007 17:33) *

Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца.... cool.gif

Да именно так, похоже он и делает.. Доказать просто, например добавив еще 1 параметр:
var a:integer;
function f( var x:integer; b:byte):integer;
begin
write (b);
f:=x;
x:=6;
end;
begin
a:=1;
writeln (f(a,1)-f(a,2));
end.


будет 215. Смысл такого порядка выполнения - вычисляется второе выражение, результат кладется в стек. Вычиляется первое и сразу из результата вычитает то что в стеке было.. Т.е. как бы компилятор соптимизировал smile.gif

Автор: volvo 26.11.2007 22:30

Цитата
Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца
Собственно, в Паскале (насколько я знаю, и в Дельфи тоже) порядок вычисления выражения не определен: http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr23.shtml#9

Поэтому вот такие заморочки всегда потенциально опасны...