В программировании особое внимание уделяется концепции о локальных и глобальных переменных, а также связанное с ними представление об областях видимости. Соответственно, локальные переменные видны только в локальной области видимости, которой может выступать отдельно взятая функция. Глобальные переменные видны во всей программе. "Видны" – значит, известны, доступны. К ним можно обратиться по имени и получить связанное с ними значение.
К глобальной переменной можно обратиться из локальной области видимости. К локальной переменной нельзя обратиться из глобальной области видимости, потому что локальная переменная существует только в момент выполнения тела функции. При выходе из нее, локальные переменные исчезают. Компьютерная память, которая под них отводилась, освобождается. Когда функция будет снова вызвана, локальные переменные будут созданы заново.
Вернемся к нашей программе из урока, немного у ее для удобства:
Правила видимости языка - это правила, управляющие тем, что «видит» часть программы.
Каждая функция в С - это дискретный блок кода. Код функции является собственностью функции, и к нему нельзя получить доступ с какого-либо оператора или другой функции, помимо вызова данной функции. (Например, невозможно, используя goto, перейти на середину другой функции.) Код, образующий тело функции, спрятан от остальной части программы. Если код не использует глобальные переменные или данные, то он и другие части программы не могут влиять друг на друга. Другими словами, код и данные, определенные в одной функции, не могут действовать на код и данные, определенные в другой функции, поскольку данные функции имеют разные области видимости.
Переменные, определенные в функциях, называются локальными переменными. Локальные переменные создаются при входе в функцию и уничтожаются при выходе из нее. Поэтому локальные переменные не могут содержать значения между вызовами функций. Единственным исключением из этого правила являются переменные, объявленные со спецификатором static. Он заставляет компилятор воспринимать данную переменную как глобальную, но область видимости по-прежнему ограничена функцией.
Все функции в С находятся на одном уровне видимости. То есть невозможно определить функцию в функции.
Объяснение:
procedure F(n: integer);
begin
if n>0 then begin
Write (n);
F(n-2);
F(n div 4);
end
end;
begin
F(9);
end.
На выходе будет 97531112
Если нужна трассировка, её можно сделать примерно так:
procedure F(n: integer);
begin
Writeln('Вход');
if n>0 then begin
Writeln ('В выходную строку: ',n);
Writeln('Вызов F(n-2)');
F(n-2);
Writeln('Вызов F(n div 4)');
F(n div 4);
end;
Writeln('Выход')
end;
begin
F(9);
end.
Результат трассировки:
Вход
В выходную строку: 9
Вызов F(n-2)
Вход
В выходную строку: 7
Вызов F(n-2)
Вход
В выходную строку: 5
Вызов F(n-2)
Вход
В выходную строку: 3
Вызов F(n-2)
Вход
В выходную строку: 1
Вызов F(n-2)
Вход
Выход
Вызов F(n div 4)
Вход
Выход
Выход
Вызов F(n div 4)
Вход
Выход
Выход
Вызов F(n div 4)
Вход
В выходную строку: 1
Вызов F(n-2)
Вход
Выход
Вызов F(n div 4)
Вход
Выход
Выход
Выход
Вызов F(n div 4)
Вход
В выходную строку: 1
Вызов F(n-2)
Вход
Выход
Вызов F(n div 4)
Вход
Выход
Выход
Выход
Вызов F(n div 4)
Вход
В выходную строку: 2
Вызов F(n-2)
Вход
Выход
Вызов F(n div 4)
Вход
Выход
Выход
Выход
В программировании особое внимание уделяется концепции о локальных и глобальных переменных, а также связанное с ними представление об областях видимости. Соответственно, локальные переменные видны только в локальной области видимости, которой может выступать отдельно взятая функция. Глобальные переменные видны во всей программе. "Видны" – значит, известны, доступны. К ним можно обратиться по имени и получить связанное с ними значение.
К глобальной переменной можно обратиться из локальной области видимости. К локальной переменной нельзя обратиться из глобальной области видимости, потому что локальная переменная существует только в момент выполнения тела функции. При выходе из нее, локальные переменные исчезают. Компьютерная память, которая под них отводилась, освобождается. Когда функция будет снова вызвана, локальные переменные будут созданы заново.
Вернемся к нашей программе из урока, немного у ее для удобства:
Правила видимости языка - это правила, управляющие тем, что «видит» часть программы.
Каждая функция в С - это дискретный блок кода. Код функции является собственностью функции, и к нему нельзя получить доступ с какого-либо оператора или другой функции, помимо вызова данной функции. (Например, невозможно, используя goto, перейти на середину другой функции.) Код, образующий тело функции, спрятан от остальной части программы. Если код не использует глобальные переменные или данные, то он и другие части программы не могут влиять друг на друга. Другими словами, код и данные, определенные в одной функции, не могут действовать на код и данные, определенные в другой функции, поскольку данные функции имеют разные области видимости.
Переменные, определенные в функциях, называются локальными переменными. Локальные переменные создаются при входе в функцию и уничтожаются при выходе из нее. Поэтому локальные переменные не могут содержать значения между вызовами функций. Единственным исключением из этого правила являются переменные, объявленные со спецификатором static. Он заставляет компилятор воспринимать данную переменную как глобальную, но область видимости по-прежнему ограничена функцией.
Все функции в С находятся на одном уровне видимости. То есть невозможно определить функцию в функции.
Объяснение: