Почему модификатор static предотвращает переназначение его переменной новым значением?

Минимальный рабочий пример выглядит следующим образом:

#include <iostream>

void func()
{
static int i = 5;
std::cout << i << std::endl;
i = 42;
std::cout << i << std::endl;
}

int main( int argc, char ** argv )
{
std::cout << "this is main()" << std::endl;
func();
func();
return 0;
}

Его вывод выглядит следующим образом:

this is main()
i is 5
i is 42
i is 42
i is 42

статический модификатор для переменной ИНТ марки ИНТпостоянное значение в течение всего процесса, в то время как статическое хранилище не хранится в стеке; таким образом, значение переносится из одного вызова функции в другой.

Тем не мение, ИНТ переназначается на значение 5 в начале FUNC () когда FUNC () называется второй раз.

Итак, почему этот пример выводит i = 42 вместо i = 5?

1

Решение

Однако int присваивается значение 5 в начале функции func (), когда функция func () вызывается во второй раз.

Нет это не назначение, но инициализация. Статические локальные переменные инициализируются только один раз, т.е. когда func() вызывается впервые.

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

4

Другие решения

Скорее всего, вас смущает знак равенства, =,

Знак равенства в static int i = 5; средства инициализация копии, не назначение:

Знак равенства, знак равно, при копировании-инициализации именованной переменной нет
связанные с оператором присваивания.

Таким образом,

Однако int переназначается значению 5 в начале функции ()

Это не верно. это никогда не назначается в начале func, ни в первый раз, ни при последующих звонках. это только назначенный i = 42;,

Вы могли бы также написать такую ​​строку:

static int i(5);
1

По вопросам рекламы [email protected]