В следующем коде 2
печатается.
int x = 1;
int f(int y)
{
return x;
}
int main() {
x = 2;
printf("%d", f(0));
}
Как это происходит, если у нас есть статическая область видимости в C? Почему нет 1
печататься?
печать 2
в данном случае это не динамическая область видимости, не так ли?
Я думал, что в статической области видимости это должно принимать ближайший x к определению функции.
Это займет ближайший x
, но так как у вас есть только один x
это действительно не имеет значения.
Если вы измените код на
int x = 1;
int f(int y)
{
return x ;
}
int main() {
int x=2;
printf("%d", f(0));
}
так что у вас есть 2 x
глобальный и локальный в main
ты увидишь 1
печатать.
Сфера охвата здесь спорна, так как у вас есть не объявил x
локально это было бы иначе слежка глобальный x
,
2
печатается.
x
назначен в main
в 2
непосредственно перед f
вызывается с параметром 0
,
(Концептуально int x = 1;
запускается раньше main
введен.)
Это способ, которым компилятор генерирует ассемблер / машинный код.
Поэтому, если вы хотите другой X в области видимости основной функции, вы должны были создать новый объект, как в ответе nwp.
Те, которые обычно называют динамическими и лексический обзорное.
Лексическая область видимости определяется полностью во время компиляции, динамическая область видимости во время выполнения.
У вас есть только одна переменная с именем «x», поэтому область действия не имеет отношения к вашей программе.
Вот программа, которая будет отличаться в зависимости от правил области видимости:
int x = 0;
int f()
{
return x;
}
int main()
{
int x = 1;
printf("%d\n", f(x));
}
Под лексическим ограничением, f
возвращает значение x
это лексически «ближайший» — глобальный.
Так что это будет печатать 0
;
При динамическом определении объема, f
вернет значение новейшего x
который является одним в main
,
Так что это будет печатать 1
,