Когда n меньше или равно 2, возвращается значение 0. (Отрицательное значение не вводит l oop, 1 и 2 приводят к i
= 0). Когда значение больше 2, значение i быстро растет из-за линии i = i*(i-1)
, пока не переполнится. Если результат переполнения - 1 (из-за i--) положительный, l oop продолжается с новым i
. Поскольку условие тестирования является допустимым, быстрый рост неизбежно продолжается и приводит к все большему и большему количеству переполнений, что в конечном итоге приведет к тому, что при уменьшении 1 значение (i--) будет нулевым или отрицательным, и тогда условие теста не может быть пройдено, for l oop заканчивается и возвращается i
.
Таким образом, положительные значения не могут быть возвращены , но i
могло быть результатом положительного результата переполнения (когда переполнение приводит к 1 и уменьшается до 0 на i -).
Рассмотрение специального случая aa (8)
Прежде всего вызывается aa (8). * Создается 1015 * int i, которому присваивается значение 0.
Начинается for l oop. i становится 8,
8> 0, поэтому мы выполняем команды внутри тела и устанавливаем i равным 8 * 7 = 56 Мы достигли конца for, поэтому выполняем i--, i становится 55,
Снова мы проверяем условие теста и 55> 0, поэтому мы снова выполняем команды i = 55 * 54, блок for завершается, и мы выполняем i-- так что i = 2969,
Мы проверяем условие теста и 2969> 0, поэтому мы выполняем команды, i = 2969 * 2968, мы выполняем i-- итак i = 8881991.
8881991> 0, поэтому мы выполняем body i = 8881991 * 8881990, теперь происходит переполнение и i становится отрицательным числом, затем число уменьшается на i--
, но теперь условие проверки i> 0 ложно, и l oop заканчивается.
i возвращается.
Результат переполнения Результатом переполнения int может быть любое из чисел в его диапазоне.
Допустим, мы начинаем отсчет с нуля, чтобы представить указанное число.
Первое число, полученное в результате переполнения:
cout << INT_MAX+1;
вывод: -2147483648 (INT_MIN)
Отсюда мы можем считать дальше, поэтому результатом может быть любое из чисел между INT_MIN и INT_MAX, тест:
cout << INT_MAX+n
Когда n находится в диапазоне [1 (INT_MIN), 1 + INT_MAX + 1 (0 до этого момента) + INT_MAX (максимум)]
Снова мы достигаем INT_MAX и можем продолжать считать, как раньше ...