Перейти к содержимому
Topos Uranos

Краткое содержание

Императивная программа не вычисляет свой результат за один раз: она строит его по шагам, сохраняя промежуточные значения и изменяя их. Этот урок изучает место, где они хранятся, то есть переменную, ячейку памяти с именем, типом и значением. Он учит объявлять и инициализировать её фигурными скобками и объясняет, почему фигурные скобки предпочтительны; менять её значение присваиванием, знак которого = означает не то, что в математике; следить за состоянием программы, то есть за значениями всех её переменных в каждый момент, с помощью таблицы трассировки; выбирать имена, говорящие, что хранит переменная; и избегать самой незаметной ошибки этого этапа: чтения переменной, которой никогда не было дано значение, что в C++ есть неопределённое поведение.

Цели обучения

  1. Объявлять и инициализировать переменные фигурными скобками и отличать инициализацию от присваивания в данной программе.
  2. Вручную следить за состоянием программы из последовательных присваиваний с помощью таблицы трассировки и так предсказывать её вывод.
  3. Выбирать английские имена, говорящие, что хранит каждая переменная, по правилам языка и руководству курса.
  4. Объяснять, почему чтение неинициализированной переменной есть неопределённое поведение, распознавать его в программе и предотвращать его, всегда инициализируя переменные.

Переменная как ячейка

В уроке От задачи к алгоритму алгоритмы записывались буквами вроде qq и rr, которые принимали одно значение, а затем другое: «rr принимает значение r−br - b». В математике буква обозначает фиксированное, хотя и неизвестное, значение; в алгоритме же она обозначает место, содержимое которого меняется. Программе на C++ нужно то же самое, и она получает это от памяти компьютера.

Оперативная память представляет собой длинную последовательность байтов, у каждого из которых есть свой порядковый номер, его адрес. Переменная есть участок этой памяти, которому программа даёт имя и тип. Следовательно, у неё четыре атрибута:

  1. имя, которым программа её обозначает (count, price);
  2. тип, который определяет, какие значения она может хранить, сколько байтов занимает и какие операции допускает: int хранит целые числа, double числа с дробной частью;
  3. значение, то, которое она хранит в данный момент и которое может меняться, пока программа выполняется;
  4. место в памяти, которое выбирают компилятор и система и которое программе почти никогда не нужно знать.

Образ, который стоит запомнить, это ячейка: имя написано сверху, значение внутри. Тип задаёт размер и форму ячейки; ячейка типа int не принимает 2.5, как ячейка для писем не принимает посылку. Рисунки этого урока так и изображают состояние программы и перерисовывают его после каждой инструкции.

То, что тип задаёт размер, можно увидеть: оператор sizeof даёт число байтов, которое занимает переменная или тип.

Программа на C++
#include <print>​int main(){    const int count{12};    const double price{4.5};    std::println("Размер count в байтах: {}", sizeof(count));    std::println("Размер price в байтах: {}", sizeof(price));}
Вывод
Размер count в байтах: 4Размер price в байтах: 8

Здесь int занимает 4 байта, а double занимает 8. Эти числа не одинаковы во всех системах, и от них зависит, сколько различных значений помещается в каждый тип; уроки Целые числа и их представление и Числа с плавающей точкой это изучат. Здесь достаточно главного: тип переменной задаётся при её объявлении и никогда не меняется; меняется её значение.