2015-01-06 2 views
-2

что использование статической переменной в этой программеЧто такое использование статических переменных внутри функций C?

/* program to find the addition of n numbers without using recursion:*/ 
#include<stdio.h> 

int main(){ 

    int n,sum; 

    printf("Enter the value of n: "); 
    scanf("%d",&n); 

    sum = getSum(n); 

    printf("Sum of n numbers: %d",sum); 

    return 0; 
} 

int getSum(n){ 

    static int sum=0; 

    if(n>0){ 
     sum = sum + n; 
     getSum(n-1); 
    } 

    return sum; 
} 
+3

Это трудно понять, что вы хотите знать о. 'Static int'' sum' действует как глобальная переменная, которая видна только внутри тела функции getSum. Отвечает ли это на ваш вопрос? –

+1

http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –

+0

Это позволяет вам более легко получить UB с многопоточными приложениями. –

ответ

1

в данном примере сумма будет объявлена ​​только один раз.

, что означает, что он получит свое начальное значение (0) только тогда, когда функция вызывается в первую очередь, каждый раз, когда функция будет вызвана, она останется со своим предыдущим значением, как глобальная переменная.

есть другое использование статики и ее довольно базовая концепция, поэтому вы должны больше узнать об этом, есть много информации в Интернете.

Как пустячный Биты suggestes, не путайте сумму от getSum и от основной функции, хотя я сказал, что вы можете просматривать сумму в качестве глобальной переменной область ее применения только в getSum функции и экземпляр в нем полностью отличающийся от основного. Подводя итог, я имею в виду экземпляр только в getSum.

1

Прежде всего функция неправильная. Либо его параметр должен быть типа unsigned int, либо внутри функции n необходимо проверить, является ли оно отрицательным. В противном случае вы можете получить неожиданный результат, когда аргумент будет отрицательным числом.

Что касается статической переменной, то она распределяется между вызовами функции. Он сохраняет свою ценность между последовательными вызовами функции. Таким образом, он используется в функции в качестве аккумулятора.

Я бы записать функцию следующим образом

int getSum(n) 
{ 
    if (n == 0) return 0; 
    else return n + (n > 0 ? getSum(n - 1) : getSum(n + 1)); 
} 

Примите во внимание, что было бы лучше, если объявление функции ставится перед функцией магистралью. В этом случае компилятор может проверить правильность вызова функции.

Также комментарий перед программой

/* program to find the addition of n numbers without using recursion:*/ 

неправильно, потому что функция является рекурсивной. :) Она называет себя.

+0

Вы заметили комментарий на первой строке? '/ *, чтобы найти добавление n чисел без использования рекурсии: * /' –

+0

@Fiddling Bits И что? Это неправильный комментарий, потому что функция рекурсивна. –

+0

Да. Это моя точка зрения. Кроме того, вопрос о статическом и нестационарном. Во всяком случае ... все еще +1 от меня. :-D –

1

Объявив его static, переменная sum сохраняется в разных вызовах функции getSum. Он выполняет то же самое, объявив sum как глобальная переменная:

int sum = 0; 

int getSum(int n) 
{ 
    if (n > 0) 
    { 
    sum = sum + n; 
    getSum(n - 1); 
    } 
    return sum; 
} 

, но ограничивая видимость sum «s в теле функции getSum.

Это, как правило, не, как вы хотите написать такую ​​функцию. Нет необходимости создавать постоянную переменную; вы можете просто написать его как

int getSum(int n) 
{ 
    if (n > 0) 
    return n + getsum(n - 1); 
    return n; 
} 

хотя вы хотите, чтобы некоторые вменяемость проверки, чтобы убедиться, что вы не переполнится, и вы, вероятно, хотите n быть unsigned ИНТ, так как вы только суммировать положительные значения и т.д.

Таким образом,

getSum(0) == 0 
getSum(1) == 1 + getSum(0) == 1 + 0 == 1 
getSum(2) == 2 + getSum(1) == 2 + 1 + getSum(0) == 2 + 1 + 0 == 3 
Смежные вопросы