1.3 – Знакомство с переменными в C++
Данные
В уроке 1.1 «Инструкции и структура программы на C++» вы узнали, что исходный код программы в основном состоит из инструкций, и что инструкции группируются в функции. Эти инструкции выполняют действия, которые (надеюсь) приводят к тому результату, для которого была разработана программа.
Но как программы на самом деле создают результаты? Они делают это, манипулируя (считывая, изменяя и записывая) данными. В вычислениях данные – это любая информация, которая может быть перемещена, обработана или сохранена компьютером.
Ключевой момент
Программы – это наборы инструкций, которые манипулируют данными для получения необходимого результата.
Программа может получать данные для работы разными способами: из файла или базы данных, по сети, от пользователя, вводящего данные с клавиатуры, или от программиста, вводящего данные непосредственно в исходный код самой программы. В программе «Hello world» в одном из предыдущих уроков текст «Hello world!» был вставлен непосредственно в исходный код программы, предоставляя данные для использования программой. Затем программа манипулирует этими данными, отправляя их на монитор для отображения.
Данные на компьютере обычно хранятся в формате, который эффективен для хранения или обработки (и, следовательно, не читается человеком). Таким образом, при компиляции программы «Hello World» текст «Hello world!» преобразуется в более эффективный формат для использования программой (двоичный, который мы обсудим на следующем уроке).
Объекты и переменные
У всех компьютеров есть память, называемая ОЗУ (сокращенно от оперативного запоминающего устройства, или RAM, «Random Access Memory», память с произвольным доступом), которая доступна для использования вашими программами. Вы можете думать о RAM как о последовательности почтовых ящиков, которые можно использовать для хранения данных во время работы программы. Отдельный фрагмент данных, хранящийся где-то в памяти, называется значением.
В некоторых старых языках программирования (например, Apple Basic) вы могли напрямую обращаться к этим почтовым ящикам (инструкция могла бы сказать что-то вроде «пойди получи значение, хранящееся в почтовом ящике с номером 7532»).
В C++ прямой доступ к памяти не разрешен. Вместо этого мы обращаемся к памяти косвенно, через объект. Объект – это область хранения (обычно в памяти), которая содержит значение и другие связанные свойства (которые мы рассмотрим в будущих уроках). При определении объекта компилятор автоматически определяет, где в памяти этот объект будет помещен. В результате, вместо того, чтобы сказать «пойди, получи значение, хранящееся в почтовом ящике с номером 7532», мы можем сказать «пойди и получи значение, хранящееся в этом объекте», и компилятор знает, где в памяти искать это значение. Это означает, что мы можем сосредоточиться на использовании объектов для хранения и извлечения значений и не беспокоиться о том, где в памяти они реально размещаются.
Объекты могут быть именованными или безымянными (анонимными). Именованный объект называется переменной, а имя объекта называется идентификатором. В наших программах большинство объектов, которые мы создадим, будут переменными.
Примечание автора
В общем программировании термин объект обычно относится к переменной, структуре данных в памяти или функции. В C++ термин «объект» имеет более узкое определение, исключающее функции.
Создание экземпляра переменной
Чтобы создать переменную, мы используем специальный вид инструкции объявления, называемый определением (мы поясним разницу между объявлением и определением позже).
Вот пример определения переменной с именем x:
int x; // определяем переменную с именем x типа int
Во время компиляции, когда компилятор видит эту инструкцию, он отмечает для себя, что мы определяем переменную, давая ей имя x
, и что она имеет тип int
(подробнее о типах чуть позже). С этого момента (с некоторыми ограничениями, о которых мы поговорим в следующем уроке) всякий раз, когда компилятор видит идентификатор x
, он будет знать, что мы ссылаемся на эту переменную.
Когда программа запускается (так называемое время выполнения, или runtime), создается экземпляр переменной. Создание экземпляра означает, что объект будет создан и ему будет назначен адрес в памяти. Прежде чем переменные можно будет использовать для хранения значений, они должны быть созданы. В качестве примера предположим, что переменная x
создается в ячейке памяти 140. Всякий раз, когда программа затем использует переменную x
, она обращается к значению в ячейке памяти 140. Созданный объект иногда также называют экземпляром.
Типы данных
До сих пор мы рассмотрели, что переменные представляют собой именованную область хранения, в которой могут храниться значения данных (как именно хранятся данные – тема будущего урока). Тип данных (чаще называемый просто типом) сообщает компилятору, какой тип значения (например, число, буква, текст и т.д.) будет хранить переменная.
В приведенном выше примере нашей переменной x
был присвоен тип int
, что означает, что переменная x
будет представлять целочисленное (integer) значение. Целое число – это число, которое можно записать без дробной части, например 4, 27, 0, -2 или -12. Для краткости можно сказать, что x
– целочисленная переменная.
В C++ тип переменной должен быть известен во время компиляции, и этот тип нельзя изменить без перекомпиляции программы. Это означает, что целочисленная переменная может содержать только целочисленные значения. Если вы хотите сохранить какое-то другое значение, вам нужно будет использовать другую переменную.
Целые числа – это лишь один из многих типов, которые C++ поддерживает из коробки. Для иллюстрации вот еще один пример определения переменной с использованием типа данных double
:
double width; // определяем переменную с именем width типа double
C++ также позволяет создавать собственные, определяемые пользователем, типы. Это то, чем мы будем много заниматься в будущих уроках, и это часть того, что делает C++ мощным.
В этих вводных главах мы будем придерживаться целочисленных переменных, потому что они концептуально просты, но вскоре мы рассмотрим многие другие типы, которые может предложить C++.
Определение нескольких переменных
Определить несколько переменных одного типа в одной инструкции можно, разделив имена запятыми. Следующие два фрагмента кода практически одинаковы:
int a;
int b;
это то же, что и
int a, b;
При таком определении нескольких переменных начинающие программисты склонны совершать две распространенные ошибки (несерьезные, поскольку компилятор их поймает и попросит исправить):
Первая ошибка при последовательном определении переменных заключается в присвоении каждой переменной типа.
int a, int b; // неправильно (ошибка компилятора)
int a, b; // правильно
Вторая ошибка – пытаться определять переменные разных типов в одной инструкции, что недопустимо. Переменные разных типов должны быть определены в отдельных инструкциях.
int a, double b; // неправильно (ошибка компилятора)
int a; double b; // правильно (но не рекомендуется)
// правильно и рекомендуется (легче читать)
int a;
double b;
Лучшая практика
Хотя язык это и позволяет, избегайте определения нескольких переменных в одной инструкции (даже если они одного типа). Вместо этого определите каждую переменную в отдельной инструкции (а затем используйте однострочный комментарий, чтобы задокументировать, для чего она используется).
Резюме
В C++ мы используем переменные для доступа к памяти. У переменных есть идентификатор, тип и значение (а также некоторые другие атрибуты, которые пока не имеют значения). Тип переменной используется для определения того, как следует интерпретировать значение в памяти.
В следующем уроке мы рассмотрим, как присвоить значения нашим переменным и как их использовать.
Небольшой тест
Вопрос 1
Что такое данные?
Ответ
Данные – это любая последовательность символов (цифр, букв и т.д.), которые можно интерпретировать как что-то.
Вопрос 2
Что такое значение?
Ответ
Значение – это отдельный фрагмент данных, хранящийся в памяти.
Вопрос 3
Что такое переменная?
Ответ
Переменная – это именованная область памяти.
Вопрос 4
Что такое идентификатор?
Ответ
Идентификатор – это имя, по которому осуществляется доступ к переменной.
Вопрос 5
Что такое тип?
Ответ
Тип сообщает программе, как интерпретировать значение в памяти.
Вопрос 6
Что такое целое число (integer)?
Ответ
Целое число – это число, которое можно записать без дробной части.