Не понимая функции статического int в C - PullRequest
0 голосов
/ 10 апреля 2019

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

#include <stdio.h>
int func1 (int x)
{
    extern int a;
    static int y=0;
    printf("%d\n%d\n",a,y);
    a=x+5; y=x+1;
    {int y=10; printf("%d\n",y);}
    return y;
}
int a;
int main()
{
    a=func1(1);
    printf("%d\n",a);
    {
        int a=1;
        printf("%d\n", a);
    }
    a=func1(a);
    printf("%d",a);
    return 0;
}

Вот вывод:

0

0

10

2

1

2

2

10

3

Сначала при запуске a = func(1) y объявляется как 0, затем изменяется на 2 и печатается 2.Но когда он запускает a = func(a), когда a равен 2, я ожидал, что y станет 0 через static int y = 0, но y не изменится.Почему этого не происходит?

Ответы [ 3 ]

3 голосов
/ 10 апреля 2019

Статический объект инициализируется концептуально при его создании.

Время жизни статического объекта начинается, когда программа начинает выполнение, и продолжается до его завершения.

Итак, когдапрограмма начинает выполнение, y инициализируется равным 0. После этого ее значение изменяется только при его изменении, как в случае операторов присваивания.Оператор, который его определяет, static int y = 0;, не изменяет его после инициализации.

1 голос
/ 10 апреля 2019

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

Таким образом, при запуске программы y инициализируется равным 0. Затем при первом вызове funcустанавливает y в 2. Это значение сохраняется даже после выхода из функции.Поэтому, когда func вызывается во второй раз, y по-прежнему равен 2, когда функция запускается.

0 голосов
/ 10 апреля 2019

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

В первый раз вы вызвали funct1 с x = 1, поэтому y вернулось как 2. В следующий раз, когда вы вызовете функцию func1 с x = 2, значение y не будет объявлено снова, но будет использоваться последнее значение последнего вызова (y = 2), и обновите его с y = x + 1, чтобы оно было 3.

TLDR; Прочитайте статическое объявление переменной только один раз (static int y = 0) и не возвращайтесь к нему снова, используйте последнее значение в следующий раз.

...