C 函数中的静态变量有啥用? [复制]

Posted

技术标签:

【中文标题】C 函数中的静态变量有啥用? [复制]【英文标题】:What is the use of static variables inside C functions? [duplicate]C 函数中的静态变量有什么用? [复制] 【发布时间】:2015-03-04 08:13:00 【问题描述】:

这个程序中静态变量有什么用

/* 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 int sum 就像一个全局变量,仅在 getSum 函数体内可见。这能回答你的问题吗? ***.com/questions/572547/… 它可以让你通过多线程应用更轻松地获得UB。 是的,当你需要处理累加器时很有用! 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

我会这样写函数

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:*/

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

【讨论】:

你注意到第一行的评论了吗? /* program to find the addition of n numbers without using recursion:*/ @Fiddling Bits 还有什么?这是一个错误的注释,因为函数是递归的。 是的。这就是我的观点。此外,问题是关于静态与非静态的。无论如何...仍然对我 +1。 :-D【参考方案3】:

通过将其声明为static,变量sumgetSum 函数的不同调用中保持不变。它完成与将sum 声明为全局变量相同的事情:

int sum = 0;

int getSum( int n )

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

但将sum 的可见性限制在getSum 函数的主体中。

这通常不是你想如何编写这样的函数,但是。无需创建持久变量;你可以写成

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

【讨论】:

以上是关于C 函数中的静态变量有啥用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C中__IO和静态关键字有啥用?

C语言中static是做啥用的?

将“this”对象分配给函数内的变量有啥用? [复制]

static变量有啥作用

静态构造函数有啥用?

C++11中的局部静态变量初始化线程安全吗? [复制]