У вас есть три набора определений переменных:
Одна глобальная int a,b,c;
,
они будут использоваться всякий раз, когда ни одно определение локальной переменной не переопределит это.
Первая локальная int a,b;
,внутри и для func1
;
второй локальный int b,c;
, внутри и для func2
;
они переопределят глобальные переменные.
Вот как работает C, и это приводит к следующей последовательности:
В func1, впервые выполненном в хронологическом порядке, две локальные переменные инициализируются, но они не влияют на func2.
В func2 локальный b
установлен на 4.
Затем локальный c
устанавливается на глобальный a
+ локальный b
, 3 + 4 == 7. Затем глобальный a
увеличивается до 17.
Выходной локальный c
равен 7.
Вернувшись в func1, локальный a
установлен на локальный a
+ локальный b
+ глобальный c
, 6 + 8 + 7 == 21.
Вывод локального a
как 21.
Это именно тот результат, который вы наблюдаете.