БлогNot. Не баг, а фича ("неверные" результаты арифметических выражений в Pascal)

Не баг, а фича ("неверные" результаты арифметических выражений в 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 [10437 просмотров]


теги: программирование ошибка числа pascal

К этой статье пока нет комментариев, Ваш будет первым