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