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

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

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


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

Здесь можно оставить коментарий, обязательны к заполнению только красные поля. Не пишите лишнего, и всё будет хорошо :)

Ваше имя:
Пароль (если желаете зарегистрировать имя):
Любимый URL (если указываете, то вставьте полностью):
Текст сообщения (до 1024 символов):
 
Введите код сообщения: 4342
 

02.02.2010, 15:34; рейтинг: 7883

  свежие записипоиск по блогукомментироватьстатистика

Наверх Яндекс.Метрика
© PerS
вход