как ведет себя эта программа,
fact(static int n)
{
int f=1;
if(n<=1) return 1;
else
{
f=n*fact(n-1);
return f;
}
}
как функция вызывает и возвращает значения, зависит от n и почему конечный результат равен 1.
как ведет себя эта программа,
fact(static int n)
{
int f=1;
if(n<=1) return 1;
else
{
f=n*fact(n-1);
return f;
}
}
как функция вызывает и возвращает значения, зависит от n и почему конечный результат равен 1.
Некоторые встроенные компиляторы C поддерживают static
в качестве спецификатора параметра как нестандартное расширение. Для этих компиляторов static
означает глобально выделенный параметр (как правило, это делается для экономии места в стеке, которое может быть очень ограничено на встроенной платформе).
В этом случае наличие параметра static
означает, что функция не является реентерабельной (не может безопасно выполнять рекурсию). Глобально распределенный n
будет просто изменяться при каждом вызове до последнего вызова fact(1)
; по мере того, как рекурсия раскручивается, каждый возвращающийся вызов будет умножать n
(теперь равный 1) на результат, поэтому чистый эффект заключается в том, что группа 1 умножается вместе для получения окончательного результата.
Спецификаторы класса хранения (кроме register
) не допускаются в объявлении параметров функции. Ваша программа не является действительной программой C.
Чтобы сделать его действительным, измените:
fact(static int n)
to
int fact(int n)
Обратите внимание, что компилятор MPLAB C18 позволяет спецификатору static
работать с параметрами в качестве расширения компилятора. Из руководства пользователя MPLAB C18:
2.3.2 Статические аргументы функции
Параметры функции могут иметь автоматический или статический класс хранения. Автоматический параметр помещается в стек программного обеспечения, что позволяет повторно входить. Статический параметр распределяется глобально, что обеспечивает прямой доступ для обычно меньшего кода. статические параметры действительны только тогда, когда компилятор работает в нерасширенном режиме (см. Раздел 1.2.5 «Выбор режима»).
static
означает, что параметр размещен глобально; таким образом, функция не является реентерабельной (не может безопасно выполнять рекурсию). - person nneonneo   schedule 03.08.2013