Статическое определение объема в C / Stack Overflow

В следующем коде 2 печатается.

int x = 1;
int f(int y)
{
return x;
}

int main() {
x = 2;
printf("%d", f(0));
}

Как это происходит, если у нас есть статическая область видимости в C? Почему нет 1 печататься?

печать 2 в данном случае это не динамическая область видимости, не так ли?

Я думал, что в статической области видимости это должно принимать ближайший x к определению функции.

1

Решение

Это займет ближайший x, но так как у вас есть только один x это действительно не имеет значения.

Если вы измените код на

int x = 1;
int f(int y)
{
return x ;
}

int main() {
int x=2;
printf("%d", f(0));
}

так что у вас есть 2 xглобальный и локальный в main ты увидишь 1 печатать.

7

Другие решения

Сфера охвата здесь спорна, так как у вас есть не объявил x локально это было бы иначе слежка глобальный x,

2 печатается.

x назначен в main в 2 непосредственно перед f вызывается с параметром 0,

(Концептуально int x = 1; запускается раньше main введен.)

2

Это способ, которым компилятор генерирует ассемблер / машинный код.

  • Первая глобальная переменная X хранится в ячейке памяти «abc»
  • выполняется следующее основное: глобальная переменная X в «abc» заменяется на 2
  • Теперь функция f () вызывается:
    • Функция f возвращает значение глобальной переменной X в «abc»: будучи 2
  • возвращаемое значение f () печатается.

Поэтому, если вы хотите другой X в области видимости основной функции, вы должны были создать новый объект, как в ответе nwp.

1

Те, которые обычно называют динамическими и лексический обзорное.

Лексическая область видимости определяется полностью во время компиляции, динамическая область видимости во время выполнения.

У вас есть только одна переменная с именем «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,

1
По вопросам рекламы [email protected]