Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中静态变量的重新说明。。。从来没有发生过?_C_Variables_Static - Fatal编程技术网

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

我试图完全理解静态变量在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(){
    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。声明语句有初始化。表达式语句有赋值。因此编译器不会“寻找初始赋值”。谢谢!我想我的错误是没有理解初始化和赋值之间的区别。仔细阅读这些区别,现在就明白了。