в чем разница ?
спасибо
Для программирующего на языке Паскаль - никакого, за одним исключением - inc(...), насколько я помню, это борландовское нвовведение. В Паскале Вирта его нет. Соответственно, могут возникнуть нюансы в другой реализации Паскаля.
Лично я страюсь использовать форму
i:=i+n
эта тема мне очень знакома ... когда мы готовились к олимпиаде в нашей команде возник вопрос о разницах этих функций . ну мы долго копались и в конце обнаружили что i:=i+1; работает быстрее чем inc(i); на FP 2.2.0. по моему это главное различие
Самое главное, что inc() - не функция, а инструкция процессора.
Собственно, и в язык она была введена исключительно из-за того, что язык Ассемблера х86 содержит несколько более высокоуровневых инсрукций, чем обычно встречается в ЯВУ. Одна из них inc.
И введено она, естественно, из соображения генерации более оптимального кода без лишней нагрузки на оптимизатор компилятора.
Кстати, косвенным подтверждением того, что это именно инструкция процессора, является тот факт, что нет ее аналога для чисел с плавающей точкой.
Inc(m); или m := m + 1; - для современного компилятора сгенерированный код должен быть идентичным.
var i: integer;и ее трансляцию на ассемблер (FPC 2.2.0 - Win32, Options -> Compiler -> Assembler -> List Source, и смотрим s-файл):
begin
i := 0;
writeln(i);
inc(i);
writeln(i);
i := i + 1;
writeln(i);
end.
# [6] inc(i);Как может inc работать медленнее при идентичных кодах? То, что на TP 7 Inc дает прирост в скорости более 20% - было, по-моему тестовые программы до сих пор лежат в FAQ-е.
movl U_P$PROGRAM_I,%eax
addl $1,%eax
jno .Lj17
call FPC_OVERFLOW
.Lj17:
movl %eax,U_P$PROGRAM_I
# Register eax,ecx,edx allocated
.stabn 68,0,7,.Ll5 - _main
.Ll5:
# [7] writeln(i);
#
# [8] i := i + 1;
movl U_P$PROGRAM_I,%eax
addl $1,%eax
jno .Lj30
call FPC_OVERFLOW
.Lj30:
movl %eax,U_P$PROGRAM_I
# Register eax,ecx,edx allocated
.stabn 68,0,9,.Ll7 - _main
.Ll7:
# [9] writeln(i);
спасибо