Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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/2/linux/27.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_Linux_Static Variables - Fatal编程技术网

C 忽略对静态变量的赋值

C 忽略对静态变量的赋值,c,linux,static-variables,C,Linux,Static Variables,我有以下代码: #include <stdio.h> int f1() { static int s=10; printf("s=%d\n",s++); } int main() { f1(); f1(); return 0; } 当调用f1时,为什么第二次忽略行static int s=10?静态变量的初始化是一次性的(初始化时间保证在第一次调用之前发生,可能发生在编译时或运行时;取决于编译器)。这是使用它们的主要原因。静态变量的初始化是

我有以下代码:

#include <stdio.h>

int f1()
{
    static int s=10;
    printf("s=%d\n",s++);
}
int main()
{
    f1();
    f1();
    return 0;
}

当调用
f1
时,为什么第二次忽略行
static int s=10

静态变量的初始化是一次性的(初始化时间保证在第一次调用之前发生,可能发生在编译时或运行时;取决于编译器)。这是使用它们的主要原因。

静态变量的初始化是一次性的(初始化时间保证在第一次调用之前发生,可能发生在编译时或运行时;取决于编译器)。这是使用它们的主要原因。

静态变量只初始化一次,从概念上讲,甚至在应用程序启动之前

根据C11(N1570)§5.1.2/p1执行环境:

应初始化所有具有静态存储持续时间的对象(设置为 它们的初始值)在程序启动之前

连同§6.2.4/p3物品的储存期限:

它的生命周期是程序的整个执行过程及其存储过程 值仅在程序启动之前初始化一次


静态
变量仅初始化一次,概念上甚至在应用程序启动之前

根据C11(N1570)§5.1.2/p1执行环境:

应初始化所有具有静态存储持续时间的对象(设置为 它们的初始值)在程序启动之前

连同§6.2.4/p3物品的储存期限:

它的生命周期是程序的整个执行过程及其存储过程 值仅在程序启动之前初始化一次


这不是赋值,而是一个初始值设定项。与全局变量一样,本地<代码>静态变量在程序启动时只初始化一次。即使在函数调用之间,它们也会保留最后分配的值。因此,在第一次调用后,它保留值
11
。事实上,它们类似于文件范围<代码>静态变量,它们的名称仅在声明它们的块的范围内已知(但您可以通过指针传递它们)

缺点是它们只存在一次。如果从多个线程调用同一函数,则它们都共享相同的变量

尝试第三次呼叫:您将获得
12


注意:初始值设定项必须是常量表达式。尝试
static int s=10,t=s+5并读取编译器错误消息。

这不是赋值,而是初始值设定项。与全局变量一样,本地<代码>静态变量在程序启动时只初始化一次。即使在函数调用之间,它们也会保留最后分配的值。因此,在第一次调用后,它保留值
11
。事实上,它们类似于文件范围<代码>静态变量,它们的名称仅在声明它们的块的范围内已知(但您可以通过指针传递它们)

缺点是它们只存在一次。如果从多个线程调用同一函数,则它们都共享相同的变量

尝试第三次呼叫:您将获得
12


注意:初始值设定项必须是常量表达式。尝试
static int s=10,t=s+5并读取编译器错误消息。

正如其他人所说,函数作用域中的
静态变量只初始化一次。因此,赋值不会在后续调用函数时发生


与其他局部变量不同,
静态
局部变量不在堆栈上定义,而是在数据段中定义,可能与全局变量位于同一位置。全局变量也在应用程序启动时初始化(它们必须初始化,因为它们不在函数内部,因此不能是可执行代码),因此从概念上讲,您可以将
静态
变量视为可见性有限的全局变量。

正如其他人所说,函数范围内的
静态
变量仅初始化一次。因此,赋值不会在后续调用函数时发生

与其他局部变量不同,
静态
局部变量不在堆栈上定义,而是在数据段中定义,可能与全局变量位于同一位置。全局变量也在应用程序启动时初始化(它们必须初始化,因为它们不在函数内部,因此不能是可执行代码),因此从概念上讲,您可以将
静态
变量视为可见性有限的全局变量。

来自C89标准3.1.2.4中指定的对象存储持续时间:

使用外部或内部链接、或存储类说明符static声明的对象具有静态存储持续时间。对于这样的对象,在程序启动之前,存储是保留的,其存储值只初始化一次。在整个程序执行过程中,对象存在并保留其最后存储的值

(重点是我的)

所以它表示,每次使用静态限定符时,该变量都会在多个函数调用中保留其值。 非静态的局部变量在每次调用delcare函数时都会初始化,因此它们不会在函数调用中保留其值

希望这有帮助

根据C89标准3.1.2.4中规定的对象存储持续时间:

使用外部或内部链接、或存储类说明符static声明的对象具有静态存储持续时间。对于这样的对象,在程序启动之前,存储是保留的,其存储值只初始化一次。在整个程序执行过程中,对象存在并保留其最后存储的值

(重点是我的)

所以它表示,每次使用静态限定符时,该变量都会在多个函数调用中保留其值。 每次调用delcare函数时,都会初始化非静态的局部变量
s=10
s=11