Не баг, а фича ("неверные" результаты арифметических выражений в Pascal)
Только что объяснял человеку, вот и запишу по горячим следам. Начинающие "паскалисты" нередко не понимают строгой типизированности этого языка, из-за чего находят в нём несуществующие "баги". Вот простейший пример.
var a,b:integer; r:longint; begin a:=1000; b:=200; r:=a*b; writeln (r); end.
Эта программа выдаст отнюдь не 200000, как может показаться. Ответ будет равен 3392 (результат переполнения). Никакого бага нет. Тип выражения в Паскале определяется только типом входящих в него переменных, но не типом переменной, куда записывается результат. То есть, мы вычислили с переполнением произведение двух переменных типа Integer
, а потом "испорченный" результат переписали в переменную типа Longint
. Ничего не изменит и
r:=Longint(a*b);
Здесь тоже сначала вычислен результат с переполнением, затем преобразован к типу Longint
. А вот
r:=Longint(a)*b;
рулит, получите свои 200000 :) Указанная ошибка часто встречается в программах начинающих. Чтобы её не повторять, помните - выражение в Паскале должно быть приведено к нужному типу в процессе его вычисления, а не после его окончания или при присваивании.
P.S. В ряде компиляторов, как во Free Pascal, ошибка не всплывёт, но это не значит, что её не нужно учитывать
02.02.2010, 15:34 [10608 просмотров]