2013-12-24 3 views
1

* Хотя мой вопрос относится к glfw, на это, вероятно, может ответить кто-то с большим количеством знаний на С ++, чем я.glfwGetTime() и статические переменные

Я имею трудное время понять поведение следующей строки кода:

static double previousSeconds = glfwGetTime(); 

Предположим, что это находится в бесконечном цикле в то время.

Если я распечатываю предыдущие секунды в цикле while, значение не изменяется. Например, я получил бы 0.420998 для вечности. glfwGetTime() возвращает второй, поскольку glfw был инициализирован. Таким образом, первый раз через время просмотра это должно быть 0.4290998, и во второй раз это должно быть ... скажем, 0.44xxxxx. Такое поведение отличается, когда я удаляю «статический», а затем подсчитывает, как и следовало ожидать. Я не понимаю, почему это статическое поведение вызывает поведение, когда значение остается неизменным. Поскольку я знаю, что статические переменные сохраняют свои значения между вызовами, но я повторно назначаю его значение каждой итерации через цикл while.

Может кто-то прояснит это для меня?

+1

Попробуйте назначить вместо intialization – Hariprasad

ответ

4

Статические переменные инициализируются только один раз, если компилятор выполняет другую инициализацию статической переменной, которую он проверит, если он уже существует, если это так, проигнорируйте его.

Итак, в первый раз через цикл статическая переменная инициализируется, все остальные значения игнорируются, поскольку она уже инициализирована.

Я думаю, эта часть охватывает C standard N3797 следующим образом:

Константы инициализация (3.6.2) из ​​ блоков-области видимости объекта со статической продолжительностью хранения, если это применимо, выполняется перед его блоком Первого вошела ,
...
В противном случае такая переменная Инициализированный первый контроль времени проходит через его объявление; такая переменная считается инициализированной по завершении ее инициализации .

Non статическая переменная следовать следующему правилу:

Переменные с автоматической продолжительности хранения (3.7.3) инициализируются каждый раз, когда их заявление-заявление выполняется .

Это объясняет, почему нестатическая переменная изменяется, а статическая - нет.

+0

Не могу поверить, что я не видел, что инициализирую вместо назначения. Благодаря! – foobar5512

Смежные вопросы