C函数中静态变量的用途是什么?

时间:2015-01-06 16:03:38

标签: c static

这个程序中静态变量的用途是什么

/* 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 个答案:

答案 0 :(得分:1)

在这个例子中,sum只会被声明一次。

这意味着它只有在第一个地方调用函数时才会得到它的初始值(0),每隔一次调用该函数它将保持其先前的值,就像一个全局变量一样。

静态的另一个用途及其非常基本的概念,所以你应该阅读更多关于它的信息,网上有很多信息。

正如Fiddling Bits建议的那样,不要混淆getSum和main函数的总和,尽管我说你可以将sum视为全局变量,其范围仅在 getSum 函数和实例中在它与主要的完全不同。总结我只是指getSum中的实例。

答案 1 :(得分:1)

首先,功能是错误的。要么其参数必须是unsigned int类型,要么必须检查函数n是否为负数。否则,当参数为负数时,您可能会得到意外结果。

对于静态变量,它在函数的调用之间共享。它在函数的连续调用之间保留其值。因此它在函数中用作累加器。

我会按照以下方式编写函数

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

考虑到函数声明放在函数main之前会更好。在这种情况下,编译器可以检查函数是否被正确调用。

该计划之前的评论

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

是错误的,因为函数是递归的。:)它自称。

答案 2 :(得分:1)

通过声明static,变量sum会在getSum函数的不同调用中持续存在。它完成了将sum声明为全局变量的相同内容:

int sum = 0;

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

但限制sumgetSum功能正文的可见性。

然而,这通常是你想要写这样的函数的方式。没有必要创建持久变量;你可以把它写成

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

虽然您需要进行一些完整性检查,以确保不会溢出,并且您可能希望nunsigned int,因为您只能将正值相加,等等

因此,

getSum( 0 ) == 0
getSum( 1 ) == 1 + getSum( 0 ) == 1 + 0 == 1
getSum( 2 ) == 2 + getSum( 1 ) == 2 + 1 + getSum( 0 ) == 2 + 1 + 0 == 3