Глиф Учебники

Урок 2. Переменные, типы, ввод и вывод

Курс «C++» · урок 2 из 10 · 4 минуты чтения

Программа из первого урока всегда выводит одно и то же. Чтобы она что-то считала, ей нужно где-то хранить числа и текст. Для этого есть переменные.

Что такое переменная

Переменная — именованное место в памяти, где лежит значение. У каждой переменной в C++ есть тип: он говорит, что в ней хранится (целое число, дробное, символ) и сколько места она занимает. Тип указывается один раз, когда переменная объявляется, и потом не меняется.

C++
#include <iostream>
using namespace std;

int main() {
    int age = 15;          // целое число
    double height = 1.72;  // дробное число
    char letter = 'A';     // один символ
    bool ready = true;     // истина или ложь
    cout << age << " " << height << " " << letter << " " << ready << "\n";
    age = 16;              // новое значение той же переменной
    cout << age << "\n";
    return 0;
}
Вывод
15 1.72 A 1
16
тип и имя место в памяти, деление — 1 байт размер int age 15 4 байта double height 1.72 8 байт char letter 'A' 1 байт bool ready true 1 байт age = 16; 16 то же место, 15 заменено на 16
Тип задаёт, сколько байт займёт переменная: обычно int — 4, double — 8, char и bool — по 1; присваивание age = 16 кладёт новое значение на то же место вместо 15.

Строка using namespace std; позволяет писать cout вместо std::cout. В учебных программах и на олимпиадах так пишут очень часто; что это значит и когда так делать не стоит, рассказывает справка using namespace std — что это.

bool выводится как 1 (истина, true) или 0 (ложь, false).

Основные типы

ТипЧто хранитПример
intцелое число примерно от −2,1 до 2,1 миллиардаint n = 42;
long longбольшое целое, примерно до 9,2·10¹⁸long long big = 10000000000LL;
doubleдробное число, около 15 верных знаковdouble pi = 3.14159;
charодин символ в одинарных кавычкахchar c = 'x';
booltrue или falsebool ok = false;
stringстрока текста в двойных кавычкахstring name = "Anna";

Для string нужен #include <string> — строкам посвящён отдельный урок Строки std::string.

Если сумма или произведение может выйти за 2 миллиарда, берите long long: int в таком случае переполняется и молча даёт неверный ответ. Подробно — в справке Переполнение int и long long.

Переменная без начального значения (int x; внутри функции) содержит случайный «мусор» — то, что осталось в памяти. Всегда задавайте значение до первого чтения.

Имена переменных

Имя состоит из латинских букв, цифр и знака _ и не может начинаться с цифры: sum, max_value, x2. Большие и маленькие буквы различаются: Sum и sum — разные переменные. Нельзя брать служебные слова языка: int, return, class и другие. Давайте понятные имена: total лучше, чем t, если переменная живёт дольше пары строк.

Арифметика

Действия: +, -, *, / и % (остаток от деления). Главная ловушка — деление: если оба числа целые, результат тоже целый, дробная часть отбрасывается.

C++
#include <iostream>
using namespace std;

int main() {
    cout << 7 / 2 << "\n";     // 3, а не 3.5
    cout << 7 % 2 << "\n";     // остаток: 1
    cout << 7.0 / 2 << "\n";   // одно число дробное — результат дробный
    cout << -7 / 2 << "\n";    // отбрасывается к нулю: -3
    cout << -7 % 2 << "\n";    // знак остатка — как у делимого
    return 0;
}
Вывод
3
1
3.5
-3
-1
3 полные пары остаток 7 / 2 = 3 сколько полных пар 7 % 2 = 1 сколько осталось 7.0 / 2 = 3.5 одно число дробное У целых дробная часть отбрасывается — к нулю −4 −3 −2 −1 0 1 2 3 4 −3.5 3.5 -7 / 2 = -3 7 / 2 = 3
7 / 2 = 3 — столько полных пар выходит из семи, 7 % 2 = 1 — остаток, с дробным 7.0 получается 3.5; у целых дробная часть отбрасывается к нулю, поэтому -7 / 2 = -3, а не -4.

Чтобы поделить две целые переменные «по-настоящему», переведите одну из них в double:

C++
#include <iostream>
using namespace std;

int main() {
    int a = 7, b = 2;
    double half = static_cast<double>(a) / b;
    cout << half << "\n";
    return 0;
}
Вывод
3.5

static_cast<double>(a) — приведение типа: значение a берётся как дробное. Часто пишут короче — (double)a / b, результат тот же.

Сокращённые записи: x += 5 значит x = x + 5, так же работают -=, *=, /=, %=. А x++ и ++x увеличивают x на единицу (чем они отличаются — в справке Разница между ++i и i++).

Ввод: cin

cin читает данные с клавиатуры (или из входного файла задачи на олимпиаде). Оператор >> пропускает пробелы и переводы строк и читает очередное значение в переменную:

C++
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    cout << a + b << "\n";
    cout << a - b << "\n";
    cout << a * b << "\n";
    cout << a / b << " " << a % b << "\n";
    return 0;
}
Ввод
17 5
Вывод
22
12
85
3 2

Числа можно ввести через пробел или каждое на своей строке — cin >> прочитает одинаково. А строку cin >> name прочитает только до первого пробела — одно слово; как прочитать строку целиком, рассказывает справка Как прочитать строку с пробелами.

cin >> a >> b; пробел перевод строки 1 7 5 a пропуск b a 17 b 5 1 7 5 a пропуск b a 17 b 5
cin >> a >> b пропускает пробел или перевод строки между числами: и из строки «17 5», и из 17 и 5 на разных строках в a попадает 17, а в b — 5.

Вывод: cout

Через << в cout можно отправить сколько угодно значений подряд: числа, строки, переменные, выражения. Пробелы и переводы строк сами не вставляются — их пишут явно: " " и "\n".

Перевод строки можно сделать и через endl: cout << x << endl;. Разница в том, что endl ещё и сразу выталкивает накопленный вывод на экран, а это медленно. Если вывод большой (тысячи строк), пишите "\n" — программа будет работать заметно быстрее. Подробнее — в справке Быстрый ввод-вывод.

Дробные числа cout по умолчанию выводит не больше чем с 6 значащими цифрами: 3.14159265 превратится в 3.14159. Как вывести ровно два знака после запятой, рассказывает справка Как вывести число с нужной точностью.

const и auto

const делает переменную неизменной — компилятор не даст присвоить ей новое значение:

C++
const int DAYS_IN_WEEK = 7;

auto просит компилятор самому вывести тип из начального значения: auto x = 5; — это int, auto y = 2.5; — double. С простыми числами удобнее писать тип явно, а auto пригодится позже, с длинными типами из стандартной библиотеки.

Частые ошибки

Коротко

Проверьте себя

1. Что выведет cout << 9 / 4;?
2. Какой тип взять для произведения двух чисел до миллиона каждое?
3. Что выведет cout << 17 % 5;?
4. Чем "\n" отличается от endl?