Краткое содержание
Императивная программа не вычисляет свой результат за один раз: она строит его по шагам, сохраняя промежуточные значения и изменяя их. Этот урок изучает место, где они хранятся, то есть переменную, ячейку памяти с именем, типом и значением. Он учит объявлять и инициализировать её фигурными скобками и объясняет, почему фигурные скобки предпочтительны; менять её значение присваиванием, знак которого = означает не то, что в математике; следить за состоянием программы, то есть за значениями всех её переменных в каждый момент, с помощью таблицы трассировки; выбирать имена, говорящие, что хранит переменная; и избегать самой незаметной ошибки этого этапа: чтения переменной, которой никогда не было дано значение, что в C++ есть неопределённое поведение.
Цели обучения
- Объявлять и инициализировать переменные фигурными скобками и отличать инициализацию от присваивания в данной программе.
- Вручную следить за состоянием программы из последовательных присваиваний с помощью таблицы трассировки и так предсказывать её вывод.
- Выбирать английские имена, говорящие, что хранит каждая переменная, по правилам языка и руководству курса.
- Объяснять, почему чтение неинициализированной переменной есть неопределённое поведение, распознавать его в программе и предотвращать его, всегда инициализируя переменные.
Переменная как ячейка
В уроке От задачи к алгоритму алгоритмы записывались буквами вроде и , которые принимали одно значение, а затем другое: « принимает значение ». В математике буква обозначает фиксированное, хотя и неизвестное, значение; в алгоритме же она обозначает место, содержимое которого меняется. Программе на C++ нужно то же самое, и она получает это от памяти компьютера.
Оперативная память представляет собой длинную последовательность байтов, у каждого из которых есть свой порядковый номер, его адрес. Переменная есть участок этой памяти, которому программа даёт имя и тип. Следовательно, у неё четыре атрибута:
- имя, которым программа её обозначает (
count,price); - тип, который определяет, какие значения она может хранить, сколько байтов занимает и какие операции допускает:
intхранит целые числа,doubleчисла с дробной частью; - значение, то, которое она хранит в данный момент и которое может меняться, пока программа выполняется;
- место в памяти, которое выбирают компилятор и система и которое программе почти никогда не нужно знать.
Образ, который стоит запомнить, это ячейка: имя написано сверху, значение внутри. Тип задаёт размер и форму ячейки; ячейка типа int не принимает 2.5, как ячейка для писем не принимает посылку. Рисунки этого урока так и изображают состояние программы и перерисовывают его после каждой инструкции.
То, что тип задаёт размер, можно увидеть: оператор sizeof даёт число байтов, которое занимает переменная или тип.
#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. Эти числа не одинаковы во всех системах, и от них зависит, сколько различных значений помещается в каждый тип; уроки Целые числа и их представление и Числа с плавающей точкой это изучат. Здесь достаточно главного: тип переменной задаётся при её объявлении и никогда не меняется; меняется её значение.
Загрузка содержимого…