6

我对这个问题的答案有疑问,但我不能对此发表评论,因为我的代表少于 50。

我想知道答案foo()是否被多次调用并且静态变量被分配了相同的次数。那么为什么静态变量不是每次都重新赋值为 10 呢?

4

3 回答 3

3

你得到了更简短的答案,但让我对此进行一些扩展。

任何对象,都有一个存储期限。存储持续时间决定了对象(或变量)的“寿命”

静态存储是存储时长之一,由关键字标记static。现在,为了详细说明生命周期,让我们检查标准的相关部分C11,第 §6.2.4 章。

从第 2 段开始,

对象的生命周期是程序执行期间保证为其保留存储的部分。一个对象存在,有一个恒定的地址,并在其整个生命周期中保留其最后存储的值。[……]

因此,最后存储的值将在整个生命周期中保留。

现在,对于具有静态存储持续时间的对象,第 3 段,

一个对象,其标识符在没有存储类说明符的情况下声明 _Thread_local,并且具有外部或内部链接或存储类说明符static,具有静态存储持续时间。它的生命周期是程序的整个执行过程,它的存储值只在程序启动之前初始化一次。

现在,关于您的问题,您看到的语句是初始化,并且根据指定的规则,它只发生一次(在程序启动之前),因此对于多个函数调用不会重复初始化。该变量保留最后存储的值。

于 2017-03-30T06:06:06.610 回答
1

实际上static变量可以被重新分配。但不能重新定义

一旦static定义了变量,它就不能在程序的整个生命周期中重新定义。但是我们可以改变这个值。

于 2017-03-30T05:47:36.547 回答
0

当您定义一个静态或全局变量时,它进入内存模型的数据段并在程序的生命周期内占用该分配,当然范围与定义它的每个变量相关联。所以当你再次进入函数时,变量存在并且它也记住了最后的内容。所以理想情况下你不能重新定义一个变量,如果你用条件绑定它,那么范围将保护它,因此它是一个新变量。

于 2017-03-30T06:06:09.183 回答