Факториальная программа со STATIC INT

как ведет себя эта программа,

fact(static int n)
{
  int f=1;
  if(n<=1) return 1;
  else
  {
   f=n*fact(n-1);
   return f;
  }
}

как функция вызывает и возвращает значения, зависит от n и почему конечный результат равен 1.


person dcoder11    schedule 03.08.2013    source источник
comment
Если, возможно, это встроенный код C, static означает, что параметр размещен глобально; таким образом, функция не является реентерабельной (не может безопасно выполнять рекурсию).   -  person nneonneo    schedule 03.08.2013
comment
Вы должны вернуть f в обоих условиях, но после рекурсивного вызова этой функции вы, наконец, вернете 1, поэтому окончательный вывод равен 1.   -  person Nagaraju    schedule 03.08.2013


Ответы (2)


Некоторые встроенные компиляторы C поддерживают static в качестве спецификатора параметра как нестандартное расширение. Для этих компиляторов static означает глобально выделенный параметр (как правило, это делается для экономии места в стеке, которое может быть очень ограничено на встроенной платформе).

В этом случае наличие параметра static означает, что функция не является реентерабельной (не может безопасно выполнять рекурсию). Глобально распределенный n будет просто изменяться при каждом вызове до последнего вызова fact(1); по мере того, как рекурсия раскручивается, каждый возвращающийся вызов будет умножать n (теперь равный 1) на результат, поэтому чистый эффект заключается в том, что группа 1 умножается вместе для получения окончательного результата.

person nneonneo    schedule 03.08.2013

Спецификаторы класса хранения (кроме register) не допускаются в объявлении параметров функции. Ваша программа не является действительной программой C.

Чтобы сделать его действительным, измените:

fact(static int n)

to

int fact(int n)

Обратите внимание, что компилятор MPLAB C18 позволяет спецификатору static работать с параметрами в качестве расширения компилятора. Из руководства пользователя MPLAB C18:

2.3.2 Статические аргументы функции

Параметры функции могут иметь автоматический или статический класс хранения. Автоматический параметр помещается в стек программного обеспечения, что позволяет повторно входить. Статический параметр распределяется глобально, что обеспечивает прямой доступ для обычно меньшего кода. статические параметры действительны только тогда, когда компилятор работает в нерасширенном режиме (см. Раздел 1.2.5 «Выбор режима»).

person ouah    schedule 03.08.2013