Автор: Xandr 7.12.2003 23:55
Доброе время суток. Если у кого время есть - то у меня такая трабла.
Цитата
Var
i :integer;
Procedure p1;
Procedure p2;
var i : real;
begin
i:=2;
end;
Begin
i:=99;
p2;
end;
function f: integer;
begin
i:=0;
f:=i;
end;
BEGIN
p1;
{*} Writeln(i+f);
{**} Writeln(f+i);
END.
по условию * должно выводить "99", а ** - "0".
Но writeln(i+f) выдает тоже "0", т.е в строке * сначала высчитывается значение функции f, в лишь затем выполняется сама строка.
А по условию writeln(i+f) должно выводить "99".
Надо объяснить, почему компилятор просматривает программу в таком порядке и предложить вариант исправления программы.
Весь прикол в том, что у меня паскаль эту программу даже трассировать отказывается - пишет "Error 202: Stack overflow error." - с чего бы это?
Надеюсь кто-нибудь разберется. Заранее благодарю.
Автор: Shadow 8.12.2003 0:27
exe - есть то попробуй протресить через отладчик
для ASM
Автор: Xandr 8.12.2003 1:46
в любом случае получается, что до * i=99, а при выполнении строки i+f сначала выполняется f, "затирающая" i на "0", а только затем - "0+0". как этот приоритет можно изменить?
Автор: trminator 8.12.2003 13:30
Я так понимаю, что для того, чтобы вычислить значение {*}, он сначала считает значение функции f (надо же ему знать, с чем складывать), и уж затем прибавляет к нему значение i, которая к тому моменту равна нулю
а как обойти... вроде без введения еще одной переменной никак...
Код
var p: integer;
BEGIN
p1;
p:=i;
{*} Writeln(p+f);
{**} Writeln(f+i);
END.
ЗЫ Все нормально трейсится, BP7.0 и Delphi5 пробовал, один результат