![]() |
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. но при использовании версии Турбо-Паскаль , результат в обоих случаях, вопреки всем правилам , будет равен нулю. Например, если сделать предположение, что все дело в приоритете операций ( выполнение арифметического выражения всегда начинается с вычисления функций), то эксперименты в этом направлении ничего не изменят : тот же нулевой результат. Вопрос = Почему в турбо паскале проявляется этот побочный эффект? |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 4:59 |