C简单静态变量行为之谜

C simple static variable behaviour mystery

我现在正在学习 C,但在理解带有静态变量的程序的某些行为时遇到了问题。据我所知,static 只是将变量的范围增加到包含它的文件。

   #include <stdio.h>
   int sum (int num) {
       static int sum =0;
       sum=sum+num;
       return sum;
   }

   int main() {
       printf("%d ",sum(55));
       printf("%d ",sum(45));
       printf("%d ",sum(50));
       return 0;
   }

如果我执行此操作,我会得到 55 100 150 作为输出。这完全可以预料。 然后我想可以通过像这样稍微改变它来减少一行:

int sum (int num) {
       static int sum =0+num;
       return sum;
   }

但是这个returns55 55 55 我不明白为什么它只有 returns 55 而没有添加其他变量,我主要给它。

当您在函数内部而不是在函数外部声明静态变量时,它只能在函数内部访问。否则它就像一个全局变量一样工作,因为它在程序的整个生命周期中都存在。它的初始值是在编译程序时确定的,因此必须用常量表达式对其进行初始化。如果初始化程序不是您示例中的常量,任何体面的编译器都应该警告您:

$ gcc -o test -Wall test.c
test.c: In function ‘sum’:
test.c:3:24: error: initializer element is not constant
        static int sum =0+num;
                        ^

请注意,您应该始终在启用警告的情况下编译 C 程序。

默认情况下,C 变量仅存在于声明它们的块中。据说是自动存储class.

通过使用关键字 static,您可以声明一个静态存储变量 class,即在整个程序运行期间都存在的变量。

即使静态变量在整个程序执行期间都存在,但它们只能在声明它们的块内访问。

范围和存储 class 是两个不同的东西。