Пусть a = 5 для определённости. В данном выражении у нас есть оператор инкремента(увеличение на 1). Посмотрим, что же получится в результате. В первом случае(a++) оператор инкремента постфиксный. Это значит, что если он входит в состав сложного выражения, то сначала выполняются другая операция, а ++ выполняется в последнюю очередь. Если же оператор инкремента префиксный, то для начала выполнится именно он. То есть, смотрите: 1)Вначале не обращаем внимания на знак ++, в качестве уменьшаемого пойдёт само значение а.(смотрим вышеизложенное). 2)Теперь определим значение вычитаемого. Ну во-первых. Именно сейчас выполняется a++ в его истинном виде, то есть, значение a становится равно 6. Далее, у нас есть оператор ещё ++a. То есть, прежде чем вычитать, значение а текущее увеличивается на 1. То есть, значение а равно 6 + 1 = 7 Ну и теперь выполняем вычитание, 5 - 7 = -2 То есть, нуля тут не получится никак, это ОЧЕНЬ ЧАСТАЯ ОШИБКА. Выходит, что второй операнд на 2 больше первого, поэтому 0 не выйдет.
Var y: System.uint64; //Большая цЫфра же и положительная x, i: byte; //Нет смысла большие числа брать слишком, переполнение будет
begin readln(x); //Принимаем число... y := 1; for i := 1 to x do y *= i; //...и умножаем такое-то количество раз if (y = 0) then //Выводим, предусмотрев переполнение writeln('Слишком большая цЫферка') else writeln(y); end.
Int64 - это то же самое, что LongInt, а Uint64 (unsign long int) - длинное число без знака, при правильном использовании позволяет записывать в переменную числа, в 2 раза превышающие максимум Int64