Статическая переменная внутри функции в C - PullRequest
98 голосов
/ 17 февраля 2011

Что будет распечатано? 6 6 или 6 7? А почему?

void foo()
{
    static int x = 5;
    x++;
    printf("%d", x);
}

int main()
{
    foo();
    foo();
    return 0;
}

Ответы [ 13 ]

1 голос
/ 17 февраля 2011

Вы получите 6 7 напечатанных как, что легко проверяется, и вот причина: Когда foo вызывается впервые, статическая переменная x инициализируется равной 5. Затем она увеличивается до 6 и печатается.

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

1 голос
/ 17 февраля 2011

Давайте просто прочитаем статью Википедии о статических переменных ...

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

0 голосов
/ 11 января 2019

По крайней мере, в C ++ 11, когда выражение, используемое для инициализации локальной статической переменной, не является «constexpr» (не может быть оценено компилятором), тогда инициализация должна произойти во время первого вызова функции.Простейшим примером является непосредственное использование параметра для инициализации локальной статической переменной.Таким образом, компилятор должен выдать код, чтобы угадать, является ли вызов первым или нет, что, в свою очередь, требует локальной логической переменной.Я скомпилировал такой пример и проверил это, увидев код сборки.Пример может быть таким:

void f( int p )
{
  static const int first_p = p ;
  cout << "first p == " << p << endl ;
}

void main()
{
   f(1); f(2); f(3);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...