1.3 – Знакомство с переменными в C++

Добавлено 7 апреля 2021 в 21:56

Данные

В уроке 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)?

Целое число – это число, которое можно записать без дробной части.

Теги

C++ / CppДля начинающихОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.