Выход: 6,7
Причина
Объявление x
находится внутри foo
, но инициализация x=5
происходит вне foo
!
Нам нужно понять, что
static int x = 5;
не совпадает с
static int x;
x = 5;
В других ответах использовались важные слова здесь, область действия и время жизни, и указывалось, что область действия x
находится от точки ее объявления в функции foo
до конца функции foo
. Например, я проверил, переместив объявление в конец функции, и это делает x
необъявленным в операторе x++;
.
Таким образом, часть static int x
(scope) оператора действительно применяется там, где вы ее читаете, где-то INSIDE функции и только оттуда, а не над ней внутри функции.
Однако часть оператора x = 5
(время жизни) - это инициализация переменной и выполнение OUTSIDE функции при загрузке программы. Переменная x
создается со значением 5
при загрузке программы.
Я прочитал это в одном из комментариев: « Кроме того, это не касается действительно запутанной части, которая заключается в том, что инициализатор пропускается при последующих вызовах. » Он пропускается на всех звонки. Инициализация переменной находится за пределами собственно кода функции.
Значение 5 теоретически устанавливается независимо от того, вызывается ли foo или нет, хотя компилятор может оптимизировать функцию, если вы ее нигде не вызываете. Значение 5 должно быть в переменной до вызова foo.
Внутри foo
оператор static int x = 5;
вряд ли вообще сгенерирует код.
Я обнаружил, что адрес x
используется, когда я поместил функцию foo
в мою программу, а затем (правильно) предположил, что то же место будет использоваться, если я снова запустил программу. Приведенный ниже частичный снимок экрана показывает, что x
имеет значение 5
даже до первого вызова foo
.
![Break Point before first call to foo](https://i.stack.imgur.com/YCU7F.png)