Программа “Hello, World!” просто записывает текст на экран. Она осуществляет вывод. Она ничего не считывает, т.е. не получает ввода от пользователя. Это довольно скучно. Реальные программы, как правило, производят результаты на основе каких-то данных, которые мы им даем, а не делают одно и то же каждый раз, когда мы их запускаем.
Для того чтобы считать данные, нам необходимо место, куда можно ввести информацию; иначе говоря, нам нужно какое-то место в памяти компьютера, чтобы разместить на нем то, что мы считаем. Мы называем такое место объектом. Объект — это место в памяти, имеющее тип, который определяет вид информации, разрешенной для хранения. Именованный объект
называется переменной. Например, строки символов вводятся в переменные типа
string
, а целые числа — в переменные типа
int
. Объект можно интерпретировать как “коробку”, в которую можно поместить значение, имеющее тип объекта.
Например, на рисунке изображен объект типа
int
с именем
age
, содержащий целое число 42. Используя строковую переменную, мы можем считать строку с устройства ввода и вывести ее на экран, как показано ниже.
// считать и записать имя
#include "std_lib_facilities.h"
int main
{
cout << "Пожалуйста, введите ваше имя (затем нажмите 'enter'):\n";
string first_name; // first_name — это переменная типа string
cin >> first_name; // считываем символы в переменную first_name
cout << "Hello, " << first_name << "!\n";
}
Директива
#include
и функция
main
известны нам из главы 2. Поскольку директива
#include
необходима во всех наших программах (вплоть до главы 12), мы отложим ее изучение, чтобы не запутывать ситуацию. Аналогично иногда мы будем демонстрировать код, который работает, только если поместить его в тело функции
main
или какой-нибудь другой.
cout << "Пожалуйста, введите ваше имя (затем нажмите 'enter'):\n";
Будем считать, что вы понимаете, как включить этот код в полную программу, чтобы провести ее тестирование.
Первая строка функции
main
просто выводит на экран сообщение, предлагающее пользователю ввести свое имя. Такое сообщение называется приглашением (prompt), поскольку оно предлагает пользователю предпринять какое-то действие. Следующие строки определяют переменную типа
string
с именем
first_name
, считывают данные с клавиатуры в эту переменную и выводят на экран слово Hello. Рассмотрим эти строки по очереди.
string first_name; // first_name — это переменная типа string
Эта строка выделяет участок памяти для хранения строки символов и присваивает ему имя
first_name
.
Инструкция, вводящая новое имя в программе и выделяющая память для переменной, называется определением.
Следующая строка считывает символы с устройства ввода (клавиатуры) в переменную:
cin >> first_name; // считываем символы в переменную first_name
Имя
cin
относится к стандартному потоку ввода (читается как “си-ин” и является аббревиатурой от haracter put), определенному в стандартной библиотеке. Второй операнд оператора
>>
(“ввести”) определяет участок памяти, в который производится ввод. Итак, если мы введем некое имя, например
Nicolas
, а затем выполним переход
на новую строку, то строка “
Nicolas
” станет значением переменной
first_name
.
Переход на новую строку необходим для того, чтобы привлечь внимание компьютера. Пока переход на новую строку не будет выполнен (не будет нажата клавиша <Enter>), компьютер просто накапливает символы. Эта “отсрочка” дает нам шанс передумать, стереть некоторые символы или заменить их другими перед тем, как нажать клавишу <Enter>. Символ перехода на новую строку не является частью строки, хранящейся в памяти.
Введя входную строку в переменную
first_name
, можем использовать ее в дальнейшем.
cout << "Hello, " << first_name << "!\n";
Эта строка выводит на экран слово Hello за которым следует имя Nicolas (значение переменной
first_name
) с восклицательным знаком (
!
) и символом перехода на новую строку экрана (
'\n'
).
Hello, Nicolas!
Если бы мы любили повторяться и набирать лишний текст, то разбили бы эту строку на несколько инструкций.
cout << "Hello, ";
cout << first_name;
cout << "!\n";
Однако мы не страдаем графоманией и, что еще важнее, — очень не любим лишние повторы (поскольку любой повтор создает возможность для ошибки), поэтому объединили три оператора вывода в одну инструкцию.
Обратите внимание на то, что мы заключили выражение
Hello
в двойные кавычки, а не указали имя
first_name
. Двойные кавычки используются для работы с литеральными строками. Если двойные кавычки не указаны, то мы ссылаемся на нечто, имеющее имя.
cout << "Имя " << " — " << first_name;
Здесь строка "
Имя
" представляет собой набор из трех символов, а имя
first_name
позволяет вывести на экран значение переменной
first_name
, в данном случае
Nicolas
. Итак, результат выглядит следующим образом:
Имя — Nicolas
3.2. Переменные
В принципе, не имея возможности хранить данные в памяти так, как показано в предыдущем примере, с помощью компьютера невозможно сделать ничего интересного. Место, в котором хранятся данные, называют объектами. Для доступа к объекту необходимо знать его имя. Именованный объект называется переменной и имеет конкретный тип (например,
int
или
string
), определяющий, какую информацию можно записать в объект (например, в переменную типа
int
можно записать число
123
, а в объект типа
string
— строку символов "
Hello, World!\n
", а также какие операции к нему можно применять (например, переменные типа
int
можно перемножать с помощью оператора
*
, а объекты типа
string
можно сравнивать с помощью оператора
<=
). Данные, записанные в переменные, называют значениями. Инструкция, определяющая переменную, называется (вполне естественно) определением, причем в определении можно (и обычно желательно) задавать начальное значение переменной. Рассмотрим следующий пример: