Как статическая переменная не переназначается внутри функции

У меня есть вопрос относительно ответа на этот вопрос, но я не могу его комментировать, потому что у меня менее 50 представителей.

Мне было интересно в ответ foo() вызывается несколько раз, а статической переменной назначается одинаковое количество раз. Так почему же статическая переменная не переназначается на 10 каждый раз?

3 ответа

Решение

На самом деле static переменные могут быть переназначены. Но не может быть переопределено.

Когда static определенная переменная не может быть переопределена в течение всего времени жизни программы. Но мы можем изменить значение.

У вас есть более короткий ответ, но позвольте мне немного подробнее остановиться на этом.

Любой объект, имеет срок хранения. Продолжительность хранения определяет "время жизни" объекта (или переменной).

Статическое хранилище - это одна из длительностей хранения, помеченная ключевым словом static, Теперь, чтобы уточнить срок службы, давайте проверим соответствующие части C11 стандарт, глава §6.2.4.

Из пункта 2

Время жизни объекта - это часть выполнения программы, в течение которой для него гарантированно хранится память. Объект существует, имеет постоянный адрес и сохраняет свое последнее сохраненное значение в течение всего времени жизни. [....]

Таким образом, последнее сохраненное значение сохраняется на протяжении всей жизни.

Теперь для объектов со статической продолжительностью хранения, пункт 3,

Объект, идентификатор которого объявлен без спецификатора класса хранения _Thread_local и либо с внешней или внутренней связью, либо со спецификатором класса хранилища static , имеет статическую продолжительность хранения. Его время жизни - это полное выполнение программы, и его сохраненное значение инициализируется только один раз, до запуска программы.

Теперь, ссылаясь на ваш вопрос, оператор, который вы видели, является инициализацией, и, согласно указанному правилу, это происходит только один раз (до запуска программы), поэтому инициализация не повторяется для нескольких вызовов функций. Переменная сохраняет последнее сохраненное значение.

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

Другие вопросы по тегам