![]() |
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. но при использовании версии Турбо-Паскаль , результат в обоих случаях, вопреки всем правилам , будет равен нулю. Например, если сделать предположение, что все дело в приоритете операций ( выполнение арифметического выражения всегда начинается с вычисления функций), то эксперименты в этом направлении ничего не изменят : тот же нулевой результат. Вопрос = Почему в турбо паскале проявляется этот побочный эффект? |
![]() ![]() |
Shadow |
![]()
Сообщение
#2
|
![]() Lonely_Raven ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 640 Пол: Мужской Репутация: ![]() ![]() ![]() |
ответ чисто интуитивен
т.к. компиляторы пишут люди, а людям свойственно ошибаться то компиляторы тоже ошибаются -=-=-= на этот вопрос легче ответить путем ТРАССИРОВАНИЯ этой проги черех отладчик в ASM коде ASSEMBLER тут реальные ответы более понятно -=-=-=- тогда сразу все станет на свои места -=-=-= -------------------- Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ --------------------- RTFM - Read the fucking manual --------------------- http://www.livejournal.com/users/lonley_raven/ |
![]() ![]() |
![]() |
Текстовая версия | 23.06.2025 21:59 |