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

What is the use of static variables inside C functions?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* 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;
}


通过声明static,变量sumgetSum函数的不同调用中持续存在。它实现了与将sum声明为全局变量相同的功能:

1
2
3
4
5
6
7
8
9
10
11
int sum = 0;

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

但限制了sumgetSum功能主体的可见性。

然而,这通常不是您想要如何编写这样的函数。不需要创建持久变量;只需将其编写为

1
2
3
4
5
6
int getSum( int n )
{
  if ( n > 0 )
    return n + getsum( n - 1 );
  return n;
}

虽然您需要进行一些健全性检查以确保不会溢出,但您可能希望nunsignedint,因为您只需要求和正值等。

因此,

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

首先,函数是错误的。它的参数必须是unsigned int类型,或者在函数n内部必须检查它是否为负。否则,当参数为负数时,可能会得到意外的结果。

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

我将按以下方式编写函数

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

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

还有节目前的评论

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

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


在此示例中,SUM将只声明一次。

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

静态的另一个用途是它的基本概念,所以你应该更多地了解它,网上有很多信息。

正如fiddling位建议的那样,不要混淆getsum和main函数的和,尽管我说过可以将sum视为全局变量,但它的作用域仅在getsum函数中,并且其中的实例与main函数中的实例完全不同。总而言之,我只是在引用getsum中的实例。