Форум «Всё о Паскале» _ Задачи _ Помогите с задачей
Автор: -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) считается именно с конца.... Осталось доказать теперь это...
Автор: -Eni- 26.11.2007 21:51
в общем получилось так Сначала вычисляется значение f(a) = 1 и помещается в стек, потом опять береться значение и помещается так же в этот же стек оно равно 6.. а дальше ) все как по маслу.. подставляется первое значение из стека, а потом второе... то есть получается такая фиговина - writeln('Ответ = ', 6 - 1); откуда и выходит пятерочка, а не минус пятерачка ))))
всем спасибо
Автор: Malice 26.11.2007 21:56
Цитата(-Eni- @ 26.11.2007 17:33)
Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца....
Да именно так, похоже он и делает.. Доказать просто, например добавив еще 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. Смысл такого порядка выполнения - вычисляется второе выражение, результат кладется в стек. Вычиляется первое и сразу из результата вычитает то что в стеке было.. Т.е. как бы компилятор соптимизировал
Автор: volvo 26.11.2007 22:30
Цитата
Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца
Собственно, в Паскале (насколько я знаю, и в Дельфи тоже) порядок вычисления выражения не определен: http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr23.shtml#9
Поэтому вот такие заморочки всегда потенциально опасны...