![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
лена |
![]()
Сообщение
#1
|
Гость ![]() |
program R;
var a,i:real; procedure P1; var b :real; procedure P2; var x,i :real; begin i:=2 begin end{P2}; i:=99;P2; writeln (i) {99} end{P1}; function F :real; var z :real; begin i:=0; F:=i end{F}; begin P1; writeln (i);{99} writeln (i+F); {99+0=0(?)} writeln (F+i); {0+0=0} end {R}. В приведенном выше примере побочный эффект выражается в том , что нарушается одно из правил сложения «при перемени мест слагаемых сумма не меняется» : i+F=99, но F+i =0. Рассмотрим причины возникновения такой ситуации и познакомимся с одной из парадоксов версии Турбо –Паскаля. Проведем анализ алгоритма главной программы R. При обращении к процедуре Р1 переменная I принимает значения 99. Причем при обращении к внутренней процедуре Р2 (имеющей локальную переменную i) значение I не меняется , согласно сформулированным правилам локализации. Функция F всегда возвращает значение , равное нулю и i=0. Поэтому, так как в первом случае переменная i является первым слагаемым, то : i+F=99. Во втором арифметическом выражении вначале происходит обращение к функции F, после которого результат функции и переменная i равны нулю, поэтому и сумма их равна нулю: F+i =0. но при использовании версии Турбо-Паскаль , результат в обоих случаях, вопреки всем правилам , будет равен нулю. Например, если сделать предположение, что все дело в приоритете операций ( выполнение арифметического выражения всегда начинается с вычисления функций), то эксперименты в этом направлении ничего не изменят : тот же нулевой результат. Вопрос = Почему в турбо паскале проявляется этот побочный эффект? |
![]() ![]() |
SKVOZNJAK |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 930 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата -=-=-= на этот вопрос легче ответить путем ТРАССИРОВАНИЯ этой проги черех отладчик в ASM коде Кто ж спорит, что так оно легче ;) Хотя это чисто индивидуально. Когда-то спросонку я переводил человеческую речь в только что изобретённый диалект асмы, глядел на виртуальный экран. Под взглядом строчки укрупнялись, и смысл проги (будили меня!) становился понятен. Наконец в программе обнаружилась дыра (из примера видно, что и от прогера тоже кое-что зависит ;) ) и я с радостью одал её на выполнение - переместился в сидячее положение и заснул снова ! Вот только потом асма куда-то улетучилась ![]() |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 13:50 |