如何/何时在C语言中声明函数中的静态变量?

如何/何时在C语言中声明函数中的静态变量?,c,static,initialization,C,Static,Initialization,我的问题是在foo()函数中,sa变量似乎是在那里声明和初始化的,但是,由于它是静态的,编译器在第一次之后会忽略它吗?为什么即使它是静态的,也没有初始化回值10 #include <stdio.h> void foo() { int a = 10; static int sa = 10; a += 5; sa += 5; printf("a = %d, sa = %d\n", a, sa); } int main() { int i; for (i = 0; i <

我的问题是在
foo()
函数中,
sa
变量似乎是在那里声明和初始化的,但是,由于它是静态的,编译器在第一次之后会忽略它吗?为什么即使它是静态的,也没有初始化回值10

#include <stdio.h>

void foo()
{
int a = 10;
static int sa = 10;

a += 5;
sa += 5;

printf("a = %d, sa = %d\n", a, sa);
}


int main()
{
int i;

for (i = 0; i < 10; ++i)
    foo();
}

在C中,
static
表示它在调用之间保持不变,因此与您建议的相反:初始化只在第一次调用时发生。在C中,
static
表示它在调用之间保持不变,因此,这与您的建议相反:初始化只在第一次调用时发生。

引用
C11
标准,第§6.2.4章,对象的存储持续时间

在没有存储类说明符的情况下声明其标识符的对象
\u Thread\u local
,具有外部或内部链接或存储类 说明符
static
,具有静态存储持续时间。它的生命周期是 在程序启动之前,程序及其存储值仅初始化一次

因此,
sa
并不是在每次调用时都被初始化。它只初始化一次,并保存最后存储的值

也就是说,关于保留价值,引用相同的规范

[…]对象存在,具有恒定地址,并保留 它在整个生命周期中的最后一个存储值。[……]


将其放入函数中的原因是将变量的范围限制在该函数范围内。

引用
C11
标准,第§6.2.4章,对象的存储持续时间

在没有存储类说明符的情况下声明其标识符的对象
\u Thread\u local
,具有外部或内部链接或存储类 说明符
static
,具有静态存储持续时间。它的生命周期是 在程序启动之前,程序及其存储值仅初始化一次

因此,
sa
并不是在每次调用时都被初始化。它只初始化一次,并保存最后存储的值

也就是说,关于保留价值,引用相同的规范

[…]对象存在,具有恒定地址,并保留 它在整个生命周期中的最后一个存储值。[……]


将其放入函数中的原因是将变量的作用域限制在该函数本身的作用域内。

如果全局声明
sa
,则程序的工作方式相同,但其作用域会有所不同:

int sa = 10;

void foo()
{
    int a = 10;

    a += 5;
    sa += 5;

    printf("a = %d, sa = %d\n", a, sa);
}

您可能希望在
foo
中声明
sa
的原因是限制其访问。

如果您全局声明
sa
,您的程序将以相同的方式工作,尽管其范围会有所不同:

int sa = 10;

void foo()
{
    int a = 10;

    a += 5;
    sa += 5;

    printf("a = %d, sa = %d\n", a, sa);
}

您可能希望在
foo
中声明
sa
的原因是为了限制其访问。

static
可以声明仅在编译单元中可见的函数

在函数中使用
静态
变量, a) 保留一段内存,该内存将保存单个值(与线程无关),并且 b) 只初始化一次。在
C++11
中,这是保证线程安全的,尽管我认为在
C
中没有这样的保证


所以只保留了一块内存。在调用函数之前,不会对其进行设置

静态
可以声明一个只在编译单元中可见的函数

在函数中使用
静态
变量, a) 保留一段内存,该内存将保存单个值(与线程无关),并且 b) 只初始化一次。在
C++11
中,这是保证线程安全的,尽管我认为在
C
中没有这样的保证


所以只保留了一块内存。在调用该函数之前,不会设置该函数。

具有
静态
存储持续时间的对象在程序启动时分配并初始化一次,并且该存储将一直保留到程序终止

因此,
sa
变量是在程序启动时分配和初始化的,而不是在第一次执行
foo
时,并且它在调用
foo
之间保持不变


但是,
sa
变量仅在
foo
函数中按名称可见

具有
静态
存储持续时间的对象在程序启动时被分配和初始化一次,并且该存储一直保持到程序终止

因此,
sa
变量是在程序启动时分配和初始化的,而不是在第一次执行
foo
时,并且它在调用
foo
之间保持不变


但是,
sa
变量仅在
foo
函数中按名称可见

请重新阅读static关键字的含义请重新阅读static关键字的含义