IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите с задачей
сообщение
Сообщение #1


Гость






вот такой код
Код

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. Заголовок темы должен быть информативным. В противном случае тема удаляется ...



Сообщение отредактировано: klem4 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






сорри у функции вар забыл )
 
var a:integer;

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

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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






да и это все в на паскале.. потому как на в среде программирования делфи все ответ именно -5
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Гость






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

всем спасибо smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(-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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
Видимо, 5 получается потому что выражение f(a)-f(a) считается именно с конца
Собственно, в Паскале (насколько я знаю, и в Дельфи тоже) порядок вычисления выражения не определен: Руководство по языку B.Pascal 7 & Objects/LR: Порядок вычисления

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.11.2020 4:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name