1. Старт: компиляция, типы, переменные, ввод-вывод, операторы
Старт: компиляция, типы, переменные, ввод-вывод, операторы
Эта статья запускает курс: вы настроите базовое понимание того, как C++-код превращается в исполняемую программу, научитесь писать минимальные программы, объявлять переменные, работать с базовыми типами, вводом-выводом и операторами. Это фундамент для всех следующих тем: функций, контейнеров, классов, памяти и многопоточности.
Как C++-код превращается в программу
C++ — компилируемый язык. Это значит, что исходный код (файл main.cpp) обычно проходит несколько этапов, прежде чем вы получите исполняемый файл.
!Схема показывает основные этапы компиляции и линковки
Этапы сборки
#include.
- Вставляет содержимое подключаемых заголовков и выполняет макросы.main.o или main.obj).Компиляторы и стандарт языка
На практике вы чаще всего встретите:
g++) на Linux и Windows (через MinGW)clang++) на macOS, Linux и WindowsВажно: C++ имеет версии стандарта (C++17, C++20, C++23). Один и тот же код может компилироваться или не компилироваться в зависимости от выбранного стандарта.
Полезные справочники:
Первая программа
Минимальная программа на C++:
Разберём построчно:
#include <iostream> подключает заголовок для ввода-вывода (потоки std::cin, std::cout).int main() — точка входа программы.std::cout << ... печатает в стандартный вывод.return 0; сообщает операционной системе, что программа завершилась успешно.Пример компиляции из командной строки
GCC или Clang:
Что означают ключевые флаги:
-std=c++20 выбирает стандарт языка.-O2 включает оптимизации.-Wall -Wextra включает полезные предупреждения.-pedantic делает проверку стандарта строже.Если вы работаете в IDE (Visual Studio, CLion, Qt Creator), она делает примерно то же самое, но скрывает команды за кнопками Build и Run.
Типы данных: что хранится в памяти
Тип определяет:
Базовые типы
| Тип | Пример | Для чего обычно используют |
|---|---|---|
| int | int x = 10; | целые числа общего назначения |
| long long | long long big = 9000000000LL; | большие целые значения |
| double | double pi = 3.14; | числа с дробной частью |
| char | char c = 'A'; | символы (байт) |
| bool | bool ok = true; | логика: истина или ложь |
Важная деталь: точный размер int и других целочисленных типов зависит от платформы и компилятора. Для задач, где важна точная разрядность, в C++ есть фиксированные типы.
Фиксированная разрядность: когда важно точно
Эти типы удобны в сетевых протоколах, бинарных форматах, криптографии, при работе с файлами и железом.
Строки
В C++ строки чаще всего представлены типом std::string:
std::string — это не массив char, а полноценный класс стандартной библиотеки.
Переменные: объявление и инициализация
Переменная — это имя, связанное с областью памяти.
Объявление
Важно: локальные переменные без инициализации могут содержать неопределённое значение. Это частый источник ошибок.
Инициализация
В C++ несколько стилей инициализации:
Практическое правило для начала:
{} там, где это удобно.const: запрет изменения
const помогает компилятору ловить ошибки и делает код понятнее.
auto: вывод типа
auto полезен, когда тип очевиден из правой части или слишком длинный. Но в учебных примерах важно не злоупотреблять, чтобы не терять понимание типов.
Ввод и вывод: std::cout и std::cin
Вывод
<< — оператор вставки в поток.
"\n" — символ перевода строки. Часто лучше использовать "\n", чем std::endl, потому что std::endl дополнительно принудительно сбрасывает буфер, что может замедлять вывод.
Ввод
>> — оператор извлечения из потока.
Важная особенность: std::cin >> x пропускает пробелы и читает до следующего пробела. Это особенно заметно со строками.
Чтение строки целиком
Чтобы читать строку с пробелами, используйте std::getline:
Если перед getline у вас был ввод через >>, может остаться перевод строки в буфере. Позже вы научитесь корректно управлять этим, но базовое правило такое: старайтесь не смешивать >> и getline без явного понимания, что остаётся во входном потоке.
Операторы: как строятся выражения
Оператор — это символ или комбинация символов, которые выполняют действие над операндами (значениями).
Арифметика
| Оператор | Пример | Смысл |
|---|---|---|
| + | a + b | сложение |
| - | a - b | вычитание |
| | a b | умножение |
| / | a / b | деление |
| % | a % b | остаток от деления (только для целых типов) |
Ключевая ловушка новичков — целочисленное деление:
Если нужен результат с дробной частью, хотя бы один операнд должен быть вещественным:
Присваивание и составные присваивания
= присваивает значение.+=, -=, *=, /=, %= сокращают запись.Сравнение
Результат сравнения — bool.
| Оператор | Пример | Смысл |
|---|---|---|
| == | a == b | равно |
| != | a != b | не равно |
| < | a < b | меньше |
| <= | a <= b | меньше или равно |
| > | a > b | больше |
| >= | a >= b | больше или равно |
Частая ошибка — перепутать = и ==. = меняет переменную, а == сравнивает.
Логические операторы
| Оператор | Пример | Смысл |
|---|---|---|
| && | a && b | логическое И |
| || | a || b | логическое ИЛИ |
| ! | !a | логическое НЕ |
&& и || используют короткое замыкание: если результат уже ясен, правая часть может не вычисляться.
Инкремент и декремент
Разница между ++x и x++ важна в выражениях, но на старте лучше избегать сложных выражений и писать изменения отдельной строкой.
Приоритет операторов
Операторы имеют приоритет, но на практике простой совет сильнее таблиц:
Мини-программа, объединяющая всё
Что вы должны уметь после этой статьи:
main.std::cin и std::cout.= против ==).