Выбрать главу

Что делает оператор присваивания с памятью

Я только что рассказывал о работе оператора присваивания, используя такие выражения, как "компьютер знает", "компьютер помнит". Но нам необходимо более строгое понимание работы этого оператора, понимание "ближе к железу".

Рассмотрим пример программы:

Dim a As Integer

Dim b As Integer

Dim у As Integer

Private Sub Command1_Click()

  a = 10: b = 6: y=a+b+1

  Debug.Print у + 200

End Sub

В программе встречаются три переменные, поэтому все они объявлены. Компьютер отведет для них в памяти три двухбайтовые ячейки. Вот как будет работать оператор присваивания:

Выполняя оператор присваивания (например, у=а+Ь+1), компьютер сначала смотрит на его правую часть (а+Ь+1). Если в ней встречаются переменные (в нашем случае это а и b), то компьютер перед вычислением ищет их значения в отведенных под них ячейках памяти (и находит там 10 и 6, так как их туда записали операторы а=10 и Ь = 6), подставляет эти значения в правую часть и вычисляет ее. Затем вычисленное значение (17) компьютер записывает в ячейку памяти, отведенную под переменную, поставленную в левой части (у).

Таким образом, когда мы говорим "Компьютер запомнил, что а равно 2", мы подразумеваем "Компьютер записал в ячейку памяти, предназначенную для а, число 2".

А теперь рассмотрим, как будут заполняться информацией ячейки а, Ь, у в процессе выполнения нашей программы. В самом начале выполнения программы в них находятся нули. Первым выполняется оператор а=10. Согласно только что приведенному определению оператора присваивания в ячейку а будет записано число 10. Затем выполняется оператор Ь= бив ячейке Ь появляется шестерка. Затем выполняется оператор у= а+Ь+1. Компьютер смотрит, что находится в ячейках а и Ь, видит там 10 и 6, подставляет их в выражение а+Ь+1, получает 17 и записывает в ячейку у. Наконец выполняется оператор Debug.Print у + 200. Компьютер заглядывает в ячейку у, видит там 17, вычисляет 17+200 и выводит 217 в окно Immediate.

Схематически этот процесс можно изобразить так:

Теперь мы можем также уточнить работу оператора Debug.Print:

Если в операторе Debug.Print встречаются выражения с переменными величинами, то Visual Basic находит в памяти значения этих величин, подставляет их в выражения, вычисляет выражения и результат выводит на экран. В память же ничего не записывается.

Задание 7: Ответьте устно, что произойдет, если поменять местами операторы Ь=6 и у=а+Ь+1?

Режим прерывания. Пошаговый режим выполнения программы

Компьютер выполняет программу со страшной скоростью. Не успели мы нажать кнопку — а результаты уже получены. Пока все идет хорошо, это нас восхищает. Когда же результаты не те, что надо (а ошибок в программе мы не видим), это начинает раздражать. Хотелось бы, чтобы компьютер работал помедленнее и хорошо бы как-нибудь подсмотреть во время работы значения переменных в памяти, это помогло бы найти ошибку. Режим прерывания для этого и предназначен.

Запустите предыдущий проект на выполнение не кнопкой Start, как вы привыкли, а клавишей F8 на клавиатуре. Это горячая клавиша для Debug -> Step Into. Проект начнет выполняться как обычно. Нажмите, как водится, кнопку Command1. И тут вы почувствуете разницу. Вместо того, чтобы полностью выполниться и показать результат, проект остановится на самой первой строке процедуры, а именно, на Private Sub Command1_Click(), в знак чего эта строка окажется подсвечена желтым цветом. Итак, только-только начав выполняться, наш проект замерз до тех пор, пока следующее нажатие F8 его не разморозит. "Мгновение остановилось".

Интересно, чему во время остановки равны значения переменных в памяти компьютера? Для того, чтобы узнать это, достаточно поместить мышиный курсор на обозначение переменной в тексте процедуры в окне кода. Как и положено, "на табло пока одни нули".

Еще раз F8. Ничего не происходит, только полоса подсветки прыгает на следующую строку. В ней находится первый исполняемый оператор вашей процедуры — а = 10.

F8. Visual Basic выполняет а = 10, а следующий оператор подсвечивается. Проверьте, чему сейчас равны а, Ь, у в памяти.

F8. Visual Basic выполняет Ь = 6, а следующий оператор подсвечивается. Проверьте, чему сейчас равны а, Ь, у в памяти.