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 是两个不同的东西。
我现在正在学习 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 是两个不同的东西。