C中静态变量的重新说明。。。从来没有发生过?
我试图完全理解静态变量在C语言中是如何工作的。我知道使用static关键字使变量的生存期等于程序的持续时间。下面的例子有一件事让我很困惑 我的静态测试.c文件:C中静态变量的重新说明。。。从来没有发生过?,c,variables,static,C,Variables,Static,我试图完全理解静态变量在C语言中是如何工作的。我知道使用static关键字使变量的生存期等于程序的持续时间。下面的例子有一件事让我很困惑 我的静态测试.c文件: #include <stdio.h> void foo(){ static int counter = 0; counter++; printf("This function has been called %i times.\n",counter); return; } int main
#include <stdio.h>
void foo(){
static int counter = 0;
counter++;
printf("This function has been called %i times.\n",counter);
return;
}
int main(){
int i;
for(i=0;i<10;i++){
foo();
}
return 0;
}
#包括
void foo(){
静态整数计数器=0;
计数器++;
printf(“此函数已调用%i次。\n”,计数器);
返回;
}
int main(){
int i;
对于(i=0;i),在调用函数之前,静态变量在程序启动时只初始化一次。它是局部变量这一事实并不影响此规则
此外,如果没有显式初始化,静态存储类变量将自动初始化为零;程序中的=0
是多余的
根据C11标准草案(ISO/IEC 9899:201x)第6.2.4节“对象的存储持续时间”,第3段:
使用存储类说明符声明其标识符的对象具有静态存储持续时间。其生存期是程序的整个执行过程,其存储值在程序启动之前仅初始化一次
是的,编译器在声明静态变量后查找初始赋值,并且在程序启动时只执行一次
但这仅在声明变量时发生。例如
void foo(){
static int counter;
counter = 0;
counter++;
printf("This function has been called %i times.\n",counter);
return;
}
每次都会打印1
。尽管使用了=
,但这是一个初始化,而不是赋值。因此,它发生在变量初始化时,而不是在“语句”明显“执行”时。由于它是一个静态变量,因此它在程序启动时初始化一次,而不是每次函数runs.静态意味着变量存在于函数的生命周期之外。将其视为一个稍微聪明的全局变量。好吧,这就是静态的目的。
…此外,初始化不是赋值。没有人赋值。“自动初始化为零,即使没有显式的初始值设定项”使static int i=42;
中的i
似乎将被初始化为0而不是42。但该语句中有一个显式的初始值设定项。我知道-但您的语句暗示零初始化适用于所有内容。所以您不喜欢“偶数”,或者什么?如果您愿意,您有很多代表可以进行编辑。完成。我看到答案正在快速更新,不想在编辑时插手。声明中的初始化不是赋值。人们可能会被=
标记误导,但它是初始化语法的一部分,与=
操作不同赋值中的ator。声明语句有初始化。表达式语句有赋值。因此编译器不会“寻找初始赋值”。谢谢!我想我的错误是没有理解初始化和赋值之间的区别。仔细阅读这些区别,现在就明白了。