Национальный исследовательский университет "Высшая Школа Экономики"
Опубликован: 01.04.2010 | Доступ: свободный | Студентов: 3836 / 673 | Оценка: 4.45 / 4.06 | Длительность: 08:48:00
ISBN: 978-5-9556-0119-9
Специальности: Программист
Лекция 4:

Переменные и типы данных

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Область видимости переменных

Все переменные обладают областью определения (областью видимости) и временем жизни. Область видимости переменной - это те процедуры, в которых переменная может быть использована, т.е. в которых доступно значение переменной.

Переменную можно объявить на уровне процедуры или на уровне модуля. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры. Это локальные переменные ( Local ) и область их видимости - конкретная процедура. Вне этой процедуры значение переменной непредсказуемо и использование переменной приводит к ошибке выполнения программы.

Область видимости переменных
Уровень объявления Оператор объявления Переменная Область видимости
Процедура Dim, Private Локальная Процедура
Уровень модуля Dim, Private Модульная Все процедуры модуля
Уровень модуля в стандартном модуле ( Module ) Public Глобальная Все процедуры проекта
Уровень модуля на процедурном листе формы или объекта MS Excel Public Модульная Все процедуры процедурного листа, в котором переменная объявлена

Переменные, объявленные явно в области описаний ( Declaratives ) при помощи оператора Private или Dim, являются модульными и известны во всех процедурах того модуля или процедурного листа, в котором они объявлены. На модульном уровне не имеет значения, какой использован оператор, но предпочтительнее использовать Private, чтобы отличить объявление модульных переменных от объявления локальных переменных.

Переменные, объявленные явно в области описаний стандартного модуля при помощи оператора Public, являются глобальными. Их значения известны во всех процедурах проекта. Такие переменные называют открытыми или общими переменными.

Важно:
  • Модульные и глобальные переменные должны быть описаны явно.
  • Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
  • Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.

Например, если определена переменная Temp на уровне процедуры и на модульном уровне, то внутри процедуры будет использоваться локальная переменная, а значение модульной переменной Temp не будет принято во внимание.

Пример

Процедура использует переменные, объявленные на разных уровнях, и демонстрирует изменение значений этих переменных.

В окне Watches представлены значения переменных PR_A, PR_B и PU_C, которые они имеют до оператора процедуры, на котором остановилось выполнение процедуры (оператор выделен желтым цветом).

Использование переменных, объявленных на разных уровнях, и демонстрация изменения значений этих переменных

увеличить изображение
Рис. 4.4. Использование переменных, объявленных на разных уровнях, и демонстрация изменения значений этих переменных

Время жизни переменных

Время жизни - это тот период, в течение которого значение переменной сохраняется. Обычные локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение - Visual Basic "забывает" значения локальных переменных. При следующем обращении к процедуре локальная переменная снова инициализируется.

Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, т.е. продлить время ее жизни. При первом входе в процедуру статическая переменная инициализируется и получает некоторое значение. При выходе из процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из процедуры.

Важно:
  • Объявление Static может быть указано только для локальных переменных.
  • Если ключевое слово Static использовано при объявлении процедуры, то все локальные переменные процедуры статические. Это можно сделать при вставке новой процедуры(команда Insert-Procedure ), пометив опцию All Local variables as Static в диалоговом окне Add Procedure.
  • Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены.
  • Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
  • Время жизни локальной переменной - процедура, в которой она объявлена.
  • Время жизни статической переменной - модуль, в котором определена процедура, объявившая эту переменную.

Инициализация переменных

При входе в процедуру локальные переменные (за исключением переменных объявленных как Static ) автоматически получают начальные значения. Начальные значения устанавливаются в соответствии с типом переменной. Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные - при первом входе в процедуру.

Значения, устанавливаемые при инициализации переменных
Тип Начальное значение
Integer, Long, Single, Double 0
String (переменная длина) Пустая строка (кол-во символов 0)
String (фиксированная длина) Заполняется символами, имеющими ASCII -код 0, иными словами Chr(0)
Variant Empty
Object Nothing

На практике для того, чтобы избежать неясностей,

Рекомендуется:
  • явным образом инициализировать переменную, прежде чем использовать ее в выражении или в правой части оператора присваивания.
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Дмитрий Денисов
Дмитрий Денисов

Еще раз повторяю вопрос  - отправил договор и сканы документов по почте - в начале августа, до  5 го, внес предоплату - летом действовала скидка - чтобы пройти курс в августе, но я уезжал в Москву. По возвращению - и  в течение месяца - никакого ответа, никаких зачислений, ничего. Как проверить, пришли ли мои документы в Интуит, предоплата, почему нет зачисления.

Дмитрий Денисов
Дмитрий Денисов

Как записаться на курс, оплатить, не ориентируюсь в программе.

Ранее у Вас учился.

Работаю преподавателем, есть справка. Как получить скидку, т.е. оплата 2000


 

Денис Ермаков
Денис Ермаков
Россия
Alexander Vizelka
Alexander Vizelka
Россия