我对this问题中的答案有疑问,但我不能发表评论,因为我的代表不到50。
我想知道答案foo()
被多次调用,而静态变量的分配次数相同。那么为什么每次都不会将静态变量重新赋值为10?
答案 0 :(得分:3)
你得到了更短的答案,但让我稍微展开一下。
任何对象都有 storage duration 。存储持续时间决定了对象(或变量)的“生命周期”。
静态存储是存储持续时间之一,由关键字static
标记。现在,详细说明生命周期,让我们检查C11
标准的相关部分,第6.2.4章。
来自第2段,
对象的生命周期是存储期间程序执行的一部分 保证为它保留。 对象存在,具有常量地址并保留 它在其整个生命周期中的最后存储价值。 [....]
因此,在整个生命周期中保留最后存储的值。
现在,对于具有静态存储持续时间的对象,第3段,
在没有存储类说明符的情况下声明其标识符的对象
_Thread_local
,可以是外部或内部链接,也可以是存储类 说明符static
具有静态存储持续时间。它的一生就是整个执行 程序及其存储的值仅在程序启动之前初始化一次。
现在,请参阅您的问题,您看到的语句是初始化,并且根据指定的规则,它只发生一次(在程序启动之前),因此初始化不会重复多个函数调用。变量保留最后存储的值。
答案 1 :(得分:1)
实际上static
变量可以重新分配。但不能重新定义。
定义static
变量后,无法在程序的整个生命周期内重新定义。但我们可以改变价值。
答案 2 :(得分:0)
当你定义一个静态或全局变量时,它会进入内存模型的数据段,它占用程序生命周期的分配,当然,范围与定义它的每个变量相关联。因此,当您再次输入该函数时,该变量存在,并且它还会记住最后一个内容。因此,理想情况下,您无法重新定义变量,如果您将其与条件绑定,则范围将保护它,因此它是一个新变量。