|
Программирование >> Формирование пользовательского контейнера
Если выполняемая функция содержит оператор return, функция interpo вызывает функцию func ret() прежде чем вернуты:я в функцию call о. Эта функция, ее код приведен далее, обрабатывает любое возвращаемое значение. Обработка возврата из функции. void func ret() int value; value = 0; Получает значение return, если есть. eval eзф (value); ret value = value; Глобальная переменная ret value - это целочисленная переменная, содержащая возвращаемое функцией значение. На первый взгляд может показаться странным, что возвращаемое значение из функции evai exp () получает локальная переменная value, а не глобальная переменная ret value. Причина в том, что функция может быть рекурсивной и eval exp() может понадобиться вызвать ту же самую функцию для получения результата. В этой ситуации для получения значения нельзя использовать глобальную переменную, так как она будет перезаписана. Присваивание значений переменным Давайте ненадолго вернемся к анадизатору выражений. Когда обнаружен оператор присваивания, вычисляется значение части выражения, расположенной справа от знака присваивания, и оно присваивается переменной, находящейся слева от этого знака с помощью функции assign var(). Однако язык С++ поддерживает разные области видимости, включая глобадьную (формадьно называемую областью видимости пространства имен (namespace scope)) и локадьную. Кроме того, локадьные области видимости могут быть вложенными. Это важно, так как влияет на способ поиска интерпретатором Mini С++ значений переменных. Для того чтобы понять почему, рассмотрим следующий пример, int count; int main О { int count, i: if(!strcmp(local var stack[i].var name, vname)) if(local var stack[i].v type == CHAR) local var stack(i].value = (char) else if(local var stack[i].v type == INT) count = 100; i = f(); return 0; int f() { int count; count = 99; return count; Когда переменной count присваивается значение, как функция assign var() узнает, на какую переменную ссылка? Имеется в виду глобальная переменная count или одна из локальных переменных count? Ответ прост. В языке С++ локальные переменные обладают большим приоритетом по сравнению с глобальными переменными с тем же именем. Кроме того, локальные переменные не известны за пределами их собственного блока. Для того чтобы понять, как эти правила можно использовать для выполнения присваиваний в только что приведенном примере, рассмотрим функцию assign var (). Присваивает значение переменной. void assign var(char *vname, int value) Сначала проверяет, не локальная ли это переменная, if(!local var stack.empty()) for(int i=local var stack.size()-1; i >= func call stack.top(); i~) local var stack[i].value = value; return; ) В противном случае проверяет глобальные переменные, for(unsigned i=0; i < global vars.size(); i++) if (!strcnp(global vars [i] .var jnanie, vname)) { if(global vars[i].v type == CHAR) global vars[i].value = (char) value; else if(global vars[i].v type == INT) global vars[i].value = value; return; throw InterpExc(NOT VAR); переменная не найдена Как уже объяснялось в предьщущем разделе, каждый раз, когда вызывается функция, текущее значение индекса вершины стека локальных переменных (local var stack) записывается в стек вызова функций (func call stack). Это значит, что любые локальные переменные, определенные в функции, будут помещены в стек над этой точкой. Следовательно, функция assign var() сначала просматривает стек локальных переменных, начиная от текущего значения вершины и заканчивая значением индекса, сохраненным при последнем вызове функции. Этот механизм гарантирует, что проверяются только локальные переменные функции (он также помогает выполнять рекурсивные функции, поскольку текущее значение вершины стека сохраняется при каждом вызове функции). Следовательно, строка примера count = 100; в функции main о приведет к вызову функции assign var() ДЛЯ поиска локальной переменной count внутри функции mainO. В функции f о оператор count = 99; вызовет функцию assign var () ДЛЯ поиска переменной count, объявленной в функции f (). Если нет локальной переменной с соответствующим именем, то просматривается список глобальных переменных. Если ни в списке локальных, ни в списке глобальных переменных нет переменной с заданным именем, возникает синтаксическая ошибка. Теперь рассмотрим приведенный далее пример объявления переменной во вложенной области видимости, int f() {
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |