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