*虽然我的问题与glfw有关,但可能由比我更多的C ++知识的人来回答。
我很难理解以下代码行的行为:
static double previousSeconds = glfwGetTime();
假设这是一个无限的while循环。
如果我在while循环中打印出previousSeconds,则该值不会更改。例如,我会永远得到0.420998。 glfwGetTime()返回自glfw初始化以来的第二个。因此,第一次看起来应该是0.4290998,第二次应该是...说0.44xxxxx。当我删除“静态”时,这种行为是不同的,然后它按照我的预期计数。我不明白为什么这种静态会导致值保持不变的行为。我知道静态变量在调用之间保留它们的值,但是我每次迭代都会通过while循环重新赋值。
有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
静态变量只初始化一次,如果编译器运行静态变量的另一个初始化,它将检查它是否已经存在,如果存在,则忽略它。
因此,第一次通过循环初始化静态变量,所有其他时间都被忽略,因为它已经初始化。
我认为C standard N3797的这一部分涵盖了这一点:
a的常量初始化(3.6.2) 具有静态存储持续时间的块范围实体(如果适用)在首次输入块之前执行 ...
否则这样的变量是 初始化第一次控制通过其声明;这样的变量被认为是初始化的 完成初始化。
非静态变量遵循以下规则:
每个声明语句都会初始化具有自动存储持续时间(3.7.3)的变量 执行。
这解释了为什么非静态变量会改变,而静态变量则不会改变。