2013-08-03 1 views
-5

, как эта программа ведет себя,Факториал программа с STATIC INT

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

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

+0

Если, возможно, это внедренный код C, 'static' означает, что параметр распределяется глобально; таким образом, функция не является повторной (она не может безопасно переписываться). – nneonneo

+0

Вы должны вернуть f в обоих условиях, но после рекурсивного вызова этой функции вы, наконец, вернетесь 1, так что конечный результат равен 1. – Nagaraju

ответ

2

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

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

2

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

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

fact(static int n) 

к

int fact(int n) 

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

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

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